加快订购的MYSQL查询

时间:2017-03-21 16:02:36

标签: mysql

我在' tblmessages'中获得了300,000行,我试图运行此查询。 如果您不使用"请通过msgId desc"它的运行速度非常快,但是当我添加订单时,速度非常慢。

我错过了什么......?

my index enter image description here

    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

1 个答案:

答案 0 :(得分:0)

有两个原因:

  

如果U不使用“按msgId desc命令”它的运行速度非常快,但是当我运行时   添加订单它非常慢。

第一个是你的查询在它的末尾有一个“LIMIT 20”行。订购此查询的结果(通过“order by”)将需要所有行,这些行满足要拉取/生成,排序等的where子句。为了得到正确的20行。

第二种是主观的,但我会说你的表没有必要的索引来支持该查询的优化。或者,另一种看待它的方式,可能是一个类似的查询,因为IF-THEN子句的多个连接通常会慢慢运行。我对修复此问题的建议是将查询简化为多个查询,或者使用相关表的“SHOW CREATE TABLE”语句更新您的问题,以及总结索引,分区等的INFORMATION_SCHEMA查询之一。从那里我们可能会更新设计(例如,添加多列索引/索引/但其拼写...)