以下查询即使没有 order by
也非常慢,我可以猜测它是 where date_affidavit_file
但是我怎样才能使它快速 order by
?也许job_id上的sublect与where匹配,然后将其传递给代码的其余部分,但我仍然需要通过服务器命令这样的服务器名称 . 有什么建议?
explain select sql_no_cache court_county, job.id as jid, job_status,
DATE_FORMAT(job.datetime_served, '%m/%d/%Y') as dserved ,
CONCAT(server.namefirst, ' ', server.namelast) as servername, client_name,
DATE_FORMAT(job.datetime_received, '%m/%d/%Y') as dtrec ,
DATE_FORMAT(job.datetime_give2server, '%m/%d/%Y') as dtg2s,
DATE_FORMAT(date_kase_filed, '%m/%d/%Y') as dkf,
DATE_FORMAT(job.date_sent_to_court, '%m/%d/%Y') as dtstc ,
TO_DAYS(datetime_served )-TO_DAYS(date_kase_filed) as totaldays from job
left join kase on kase.id=job.kase_id
left join server on job.server_id=server.id
left join client on kase.client_id=client.id
left join LUcourt on LUcourt.id=kase.court_id
where date_affidavit_filed is not null and date_affidavit_filed !='' order by servername;
+----+-------------+---------+--------+----------------------+---------+---------+-----------------------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+--------+----------------------+---------+---------+-----------------------+--------+----------------------------------------------+
| 1 | SIMPLE | job | ALL | date_affidavit_filed | NULL | NULL | NULL | 365212 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | kase | eq_ref | PRIMARY | PRIMARY | 4 | pserve.job.kase_id | 1 | |
| 1 | SIMPLE | server | eq_ref | PRIMARY | PRIMARY | 4 | pserve.job.server_id | 1 | |
| 1 | SIMPLE | client | eq_ref | PRIMARY | PRIMARY | 4 | pserve.kase.client_id | 1 | |
| 1 | SIMPLE | LUcourt | eq_ref | PRIMARY | PRIMARY | 4 | pserve.kase.court_id | 1 | |
+----+-------------+---------+--------+----------------------+---------+---------+-----------------------+--------+----------------------------------------------+
4 回答
检查以下列中是否有索引 .
job.kase_id
或job.server_id
您也是按计算字段排序,这不是最佳的 . 也许用带索引的字段排序 .
如果需要保留该精确排序,可能需要在DB中为该值添加一个字段 . 并使用适当的值填充它或在DB上设置触发器以自动为其填充 .
这可以通过以下方式加快订单:
如果你做
ORDER BY (server.namefirst, server.namelast)
而不是ORDER BY servername
,它应该产生相同的输出 .您还可以在要加入的任何字段上的每个表上创建索引,这也可以提高查询的性能 .
写的时候
你实际上是在选择大部分行 . 或者至少这么多,以至于不值得通过索引编制 . 查询计划程序看到有一个涉及
date_affidavit_filed
的索引,但决定不使用它并使用WHERE子句,该子句只涉及date_affidavit_filed
;所以我们知道这不是一个关键问题,它必须是一个基数问题 .您可以尝试通过创建索引来优化它
以该顺序 . 查询返回了多少行?
你正在选择那些非空的东西 . 这真的意味着一切 . 我不知道你有多少行数据,但要经历多少 .
尝试将查询缩小到日期范围或特定客户端 .
如果你真的需要一切,不要在一段时间之后输出一行,而是在你用来输出所有格式的软件中 Build 一个大字符串,然后当你完成循环结果并且你构建了您希望输出的数据可以在一个大的输出中输出 .
您也可以使用分页 . 只需在第1页添加
limit 0,30
,在第2页添加limit 30,30
等,然后让最终用户浏览页面 .