PHP-MySQL左联接,分组依据,排序依据,限制=糟糕的性能

我目前正在开发一个应用程序,允许用户使用各种参数搜索文档数据库,并返回一组分页结果.我正在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);

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...