我在' tblmessages'中获得了300,000行,我试图运行此查询。 如果您不使用"请通过msgId desc"它的运行速度非常快,但是当我添加订单时,速度非常慢。
我错过了什么......?
SELECT msgId
FROM tblmessages
left join wp_users as a on a.ID = (CASE WHEN (msgFromUserId=1) then tblmessages.msgToUserId else tblmessages.msgFromUserId END)
left join tblforum_users u1 on u1.user_ID =(CASE WHEN (msgFromUserId=1) then tblmessages.msgToUserId else tblmessages.msgFromUserId END)
where (msgFromUserId=1 or msgToUserId=1)
order by msgId desc limit 0,20
解释后:
+----+-------------+-------------+------------+-------------+---------------------------------------+---------------------------------------+---------+------+--------+----------+-----------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+-------------+---------------------------------------+---------------------------------------+---------+------+--------+----------+-----------------------------------------------------+
| 1 | SIMPLE | tblmessages | NULL | index_merge | IXtbl_messages_from,IX_tblmessages_to | IX_tblmessages_from,IX_tblmessages_to | 5,5 | NULL | 726454 | 100.00 | Using union(IX_tblmessages_from,IX_tblmessages_to); |
Using where; Using filesort |
| 1 | SIMPLE | a | NULL | eq_ref | PRIMARY | PRIMARY | 8 | func | 1 | 100.00 | Using where; Using index |
| 1 | SIMPLE | u1 | NULL | eq_ref | PRIMARY | PRIMARY | 4 | func | 1 | 100.00 | Using where; Using index |
+----+-------------+-------------+------------+-------------+---------------------------------------+---------------------------------------+---------+------+--------+----------+-----------------------------------------------------+
以及有关tblmessages
的更多信息:
Data 12.1 GiB
Index 190.8 MiB
Total 12.3 GiB
答案 0 :(得分:0)
有两个原因:
如果U不使用“按msgId desc命令”它的运行速度非常快,但是当我运行时 添加订单它非常慢。
第一个是你的查询在它的末尾有一个“LIMIT 20”行。订购此查询的结果(通过“order by”)将需要所有行,这些行满足要拉取/生成,排序等的where子句。为了得到正确的20行。
第二种是主观的,但我会说你的表没有必要的索引来支持该查询的优化。或者,另一种看待它的方式,可能是一个类似的查询,因为IF-THEN子句的多个连接通常会慢慢运行。我对修复此问题的建议是将查询简化为多个查询,或者使用相关表的“SHOW CREATE TABLE”语句更新您的问题,以及总结索引,分区等的INFORMATION_SCHEMA查询之一。从那里我们可能会更新设计(例如,添加多列索引/索引/但其拼写...)