| 
                         执行计划简化为: 
- +----+-------------+-------+------+---------------+-------+---------+-------+------+-----------------------------------------------------+  
 - | id | select_type | table | type | possible_keys | key   | key_len | ref   | rows | Extra                                               |  
 - +----+-------------+-------+------+---------------+-------+---------+-------+------+-----------------------------------------------------+  
 - | 1  | PRIMARY     |       |      |               |       |         |       |      | Impossible WHERE noticed after reading const tables |  
 - | 2  | DERIVED     | o     | ref  | idx_2,idx_5   | idx_5 | 8       | const | 1    | Using where; Using filesort                         |  
 - +----+-------------+-------+------+---------------+-------+---------+-------+------+-----------------------------------------------------+ 
 
  
4、混合排序 
MySQL 不能利用索引进行混合排序。但在某些场景,还是有机会使用特殊方法提升性能的。 
- SELECT *   
 - FROM   my_order o   
 -        INNER JOIN my_appraise a ON a.orderid = o.id   
 - ORDER  BY a.is_reply ASC,   
 -           a.appraise_time DESC   
 - LIMIT  0, 20  
 
  
执行计划显示为全表扫描: 
- +----+-------------+-------+--------+-------------+---------+---------+---------------+---------+-+  
 - | id | select_type | table | type   | possible_keys     | key     | key_len | ref      | rows    | Extra   
 - +----+-------------+-------+--------+-------------+---------+---------+---------------+---------+-+  
 - |  1 | SIMPLE      | a     | ALL    | idx_orderid | NULL    | NULL    | NULL    | 1967647 | Using filesort |  
 - |  1 | SIMPLE      | o     | eq_ref | PRIMARY     | PRIMARY | 122     | a.orderid |       1 | NULL           |  
 - +----+-------------+-------+--------+---------+---------+---------+-----------------+---------+-+ 
 
  
由于 is_reply 只有0和1两种状态,我们按照下面的方法重写后,执行时间从1.58秒降低到2毫秒。 
- SELECT *   
 - FROM   ((SELECT *  
 -          FROM   my_order o   
 -                 INNER JOIN my_appraise a   
 -                         ON a.orderid = o.id   
 -                            AND is_reply = 0   
 -          ORDER  BY appraise_time DESC   
 -          LIMIT  0, 20)   
 -         UNION ALL   
 -         (SELECT *  
 -          FROM   my_order o   
 -                 INNER JOIN my_appraise a   
 -                         ON a.orderid = o.id   
 -                            AND is_reply = 1   
 -          ORDER  BY appraise_time DESC   
 -          LIMIT  0, 20)) t   
 - ORDER  BY  is_reply ASC,   
 -           appraisetime DESC   
 - LIMIT  20; 
 
  
5、EXISTS语句                         (编辑:滁州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |