mysql 联合查询 order by 慢的问题

梁晋 发布于 2015/06/15 13:55
阅读 1K+
收藏 0

SQL语句:
select `fc`.`projectsid` AS `projectsid`,`fc`.`description` AS `description`,`fc`.`createdtime` AS `createdtime`,`fc`.`feeperiod` AS `feeperiod`,`fc`.`feestartdate` AS `feestartdate`,`fc`.`feeenddate` AS `feeenddate`,ifnull(`fc`.`feeamount`,0) AS `feeamount`,`fc`.`cheweino` AS `cheweino`,`fc`.`cheweisid` AS `cheweisid`,`p`.`projectname` AS `projectname`,`fi`.`feeitemname` AS `feeitemname`,`fc`.`modifiedtime` AS `modifiedtime`,ifnull(`f`.`cf_1052`,0) AS `fangarea`,ifnull(`f`.`cf_1054`,_utf8'') AS `fangstatus`,ifnull(`f`.`cf_1042`,_utf8'') AS `buildtype`
from (((`ec_feecreates` `fc` join `ec_feeitems` `fi` on((`fc`.`feeitemsid` = `fi`.`feeitemsid`)))
join `ec_fanginfos` `f` on((`fc`.`fanginfosid` = `f`.`fanginfosid`)))
join `ec_projects` `p` on((`fc`.`projectsid` = `p`.`projectsid`)))
where ((`fc`.`feestatus` = _utf8'未收') and (`p`.`deleted` = 0) and (`fi`.`deleted` = 0) and (`f`.`deleted` = 0))
order by projectname,fangstatus

版本:MYSQL 5.6.25

现象:不加order by ,执行速度不到1秒
加了 order by 执行速度 8秒
数据量 4万条,projectname,fangstatus 两个字段均在各自的表上建有单独索引
采用explain 执行了一下,Using where; Using temporary; Using filesort  39000行,貌似是先生成一个临时表,然后再去排序,造成时间过长

这种情况下该如何优化?

加载中
0
梦想岛
梦想岛
feestatus 这个为何不用int
ifnull用程序来搞吧,数据库没必要这样做。
梁晋
梁晋
保存的时候,就是字符串
0
Jack_Q
Jack_Q

order by 应该是无法索引。

看使用物化视图试试。

同时设置下sort_buffer_size大小。

0
不是simaguo
不是simaguo

explain 截个图出来看看.

在某些情况下,MySQL不能使用索引来解决ORDER BY,尽管它仍然使用索引来找到匹配WHERE子句的行。这些情况包括:

  • 你正联接许多表,并且ORDER BY中的列并不是全部来自第1个用于搜索行的非常量表。(这是EXPLAIN输出中的没有const联接类型的第1个表)。

如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。如果不能,可以尝试下面的策略:

·         增加sort_buffer_size变量的大小。

·         增加read_rnd_buffer_size变量的大小。

0
Tuesday
Tuesday

order by 慢已经讨论很久了, 这是客观存在的问题.

就好比, 你将1万人排个序, 不容易.

梁晋
梁晋
请列举一些文章以便学习
0
梁晋
梁晋

引用来自“simaguo”的评论

explain 截个图出来看看.

在某些情况下,MySQL不能使用索引来解决ORDER BY,尽管它仍然使用索引来找到匹配WHERE子句的行。这些情况包括:

  • 你正联接许多表,并且ORDER BY中的列并不是全部来自第1个用于搜索行的非常量表。(这是EXPLAIN输出中的没有const联接类型的第1个表)。

如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。如果不能,可以尝试下面的策略:

·         增加sort_buffer_size变量的大小。

·         增加read_rnd_buffer_size变量的大小。

不是simaguo
不是simaguo
不加order by 的explain呢
0
jiangygvip
jiangygvip

前两天用MySQL存储数据,

有一个表数据量有200W,结果一关联,那速度我都醉了……

PS:主键、索引都正确建立了

jiangygvip
jiangygvip
回复 @梁晋 : 查询出结果需要30多秒,机器配置太破应该也有一部分原因……
梁晋
梁晋
多慢?
返回顶部
顶部