我目前正在开发一个应用程序,允许用户使用各种参数搜索文档数据库,并返回一组分页结果.我正在PHP / MysqL中构建它,这不是我通常的开发平台,但是到目前为止它还很出色.
我遇到的问题是,要返回完整的结果集,我必须在每个表上使用LEFT JOIN,这完全破坏了我的性能.开发数据库的人说,我正在使用的查询将返回正确的结果,所以这就是我必须使用的.查询如下,我绝不是sql Guru,可以在此上使用一些帮助.
SELECT d.title, d.deposition_id, d.folio_start, d.folio_end, pl.place_id, p.surname, p.forename, p.person_type_id, pt.person_type_desc, p.age, d.manuscript_number, dt.day, dt.month, dt.year, plc.county_id, c.county_desc
FROM deposition d
LEFT JOIN person AS p ON p.deposition_id = d.deposition_id
LEFT JOIN person_type AS pt ON p.person_type_id = pt.person_type_id
LEFT JOIN place_link AS pl ON pl.deposition_id = d.deposition_id
LEFT JOIN date AS dt ON dt.deposition_id = d.deposition_id
LEFT JOIN place AS plc ON pl.place_id = plc.place_id
LEFT JOIN county AS c ON plc.county_id = c.county_id
WHERE 1 AND d.manuscript_number = '840'
GROUP BY d.deposition_id ORDER BY d.folio_start ASC
LIMIT 0, 20
任何帮助或指导将不胜感激!
沉积表:
CREATE TABLE IF NOT EXISTS `deposition` (
`deposition_id` varchar(11) NOT NULL default '',
`manuscript_number` int(10) NOT NULL default '0',
`folio_start` varchar(4) NOT NULL default '0',
`folio_end` varchar(4) default '0',
`page` int(4) default NULL,
`deposition_type_id` int(10) NOT NULL default '0',
`comments` varchar(255) default '',
`title` varchar(255) default NULL,
PRIMARY KEY (`deposition_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
日期表
CREATE TABLE IF NOT EXISTS `date` (
`deposition_id` varchar(11) NOT NULL default '',
`day` int(2) default NULL,
`month` int(2) default NULL,
`year` int(4) default NULL,
PRIMARY KEY (`deposition_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
人物类型
CREATE TABLE IF NOT EXISTS `person_type` (
`person_type_id` int(10) NOT NULL auto_increment,
`person_type_desc` varchar(255) NOT NULL default '',
PRIMARY KEY (`person_type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=59 ;
解决方法:
几乎可以肯定,性能欠佳是由于缺乏索引.您的沉积表没有任何索引,这可能意味着您所引用的其他表也没有任何索引.您可以从在沉积表中添加索引开始.在MysqL Shell或PHPMyAdmin中,发出以下查询.
ALTER TABLE沉积添加索引(deposition_id,manuscript_number);
您知道在添加索引后查询执行得更快时,您就走对了.从那里,您可能希望将索引放在引用列的其他表上.例如,对于查询的这一部分“ LEFT JOIN person AS p ON p.deposition_id = d.deposition_id”,您可以尝试使用将索引添加到人员表.
ALTER TABLE人员添加索引(deposition_id);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。