1

即使没有下面的查询也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;
+----+-------------+---------+--------+----------- ------------+---------+---------+------------------ -----+--------+------------------------------------ ------------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+---------+--------+----------- ------------+---------+---------+------------------ -----+--------+------------------------------------ ------------+
| 1 | 简单 | 工作 | 全部 | date_affidavit_filed | 空 | 空 | 空 | 365212 | 使用哪里;使用临时的;使用文件排序 |
| 1 | 简单 | 加濑 | eq_ref | 初级 | 初级 | 4 | pserve.job.kase_id | 1 | |
| 1 | 简单 | 服务器 | eq_ref | 初级 | 初级 | 4 | pserve.job.server_id | 1 | |
| 1 | 简单 | 客户 | eq_ref | 初级 | 初级 | 4 | pserve.kase.client_id | 1 | |
| 1 | 简单 | 卢考特 | eq_ref | 初级 | 初级 | 4 | pserve.kase.court_id | 1 | |
+----+-------------+---------+--------+----------- ------------+---------+---------+------------------ -----+--------+------------------------------------ ------------+
4

4 回答 4

1

检查您是否在以下列上有索引。job.kase_id或者job.server_id

此外,您正在按不是最佳的计算字段进行排序。也许按带有索引的字段排序。

如果您需要保留该精确排序,您可能需要在数据库中为该值添加一个字段。并使用适当的值填充它或在数据库上设置触发器以自动为您填充它。

于 2012-09-13T14:48:40.307 回答
1

这可以通过以下方式加快订单:

CREATE INDEX namefull ON server (namefirst,namelast);

如果你这样做ORDER BY (server.namefirst, server.namelast)而不是ORDER BY servername,它应该产生相同的输出。

您还可以在要加入的任何字段的每个表上创建索引,这也可以提高查询的性能。

于 2012-09-13T15:02:54.860 回答
0

写的时候,

where date_affidavit_filed  is not null and date_affidavit_filed  !=''

您实际上正在选择大多数行。或者至少太多以至于不值得通过索引运行。查询计划器看到有一个索引涉及date_affidavit_filed,但决定不使用它并使用仅涉及date_affidavit_filed;的 WHERE 子句。所以我们知道这不是关键问题,它一定是基数问题。

|  1 | SIMPLE      | job     | ALL    | date_affidavit_filed | NULL    | NULL    | NULL                  | 365212 | Using where; Using temporary; Using filesort | 

您可以尝试通过在

date_affidavit_filed, kase_id, server_id

以该顺序。查询返回多少行?

于 2012-09-13T14:50:31.620 回答
0

您正在选择真正不为空的所有内容。这真的意味着一切。我不知道你有多少行数据,但要经历很多。

尝试将查询范围缩小到日期范围或特定客户。

如果你真的需要一切,不要一次又一次地输出它,而是在你用来输出所有格式的软件中建立一个大字符串,然后当你完成循环遍历结果并构建您希望输出的数据可以一次性输出。

您也可以使用分页。只需添加limit 0,30第 1limit 30,30页、第 2 页等,然后让最终用户浏览这些页面。

于 2012-09-13T15:02:05.100 回答