| 由于最后 WHERE 条件以及排序均针对最左主表,因此可以先对 my_order 排序提前缩小数据量再做左连接。SQL 重写后如下,执行时间缩小为1毫秒左右。 SELECT *   FROM (  SELECT *   FROM   my_order o   WHERE  ( o.display = 0 )          AND ( o.ostaus = 1 )   ORDER  BY o.selltime DESC   LIMIT  0, 15  ) o        LEFT JOIN my_userinfo u                 ON o.uid = u.uid        LEFT JOIN my_productinfo p                 ON o.pid = p.pid   ORDER BY  o.selltime DESC  limit 0, 15 
 再检查执行计划:子查询物化后(select_type=DERIVED)参与 JOIN。虽然估算行扫描仍然为90万,但是利用了索引以及 LIMIT 子句后,实际执行时间变得很小。 +----+-------------+------------+--------+---------------+---------+---------+-------+--------+----------------------------------------------------+  | id | select_type | table      | type   | possible_keys | key     | key_len | ref   | rows   | Extra                                              |  +----+-------------+------------+--------+---------------+---------+---------+-------+--------+----------------------------------------------------+  |  1 | PRIMARY     | <derived2> | ALL    | NULL          | NULL    | NULL    | NULL  |     15 | Using temporary; Using filesort                    |  |  1 | PRIMARY     | u          | eq_ref | PRIMARY       | PRIMARY | 4       | o.uid |      1 | NULL                                               |  |  1 | PRIMARY     | p          | ALL    | PRIMARY       | NULL    | NULL    | NULL  |      6 | Using where; Using join buffer (Block Nested Loop) |  |  2 | DERIVED     | o          | index  | NULL          | idx_1   | 5       | NULL  | 909112 | Using where                                        |  +----+-------------+------------+--------+---------------+---------+---------+-------+--------+----------------------------------------------------+ 
 8、中间结果集下推 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |