我该如何优化MySQL查询

时间:2015-11-02 06:36:01

标签: mysql optimization

我有如下查询:

SELECT u.id, u.firstName, u.lastName, u.email, u.ssoProfile, SUM(p.number) AS totalPoints, u.vip 
FROM `user` u
LEFT JOIN `point` p
ON u.id = p.user
AND p.expiryDate > NOW()
GROUP BY u.id
ORDER BY u.firstName ASC, u.lastName ASC, u.email ASC
LIMIT 10;

我添加了索引

  • 用户表1索引(firstName, lastName, email)希望它能加快ORDER BY
  • 点表2索引(userexpireDate

当我执行EXPLAIN

mysql> EXPLAIN SELECT u.id, u.firstName, u.lastName, u.email, u.ssoProfile, SUM(p.number) AS totalPoints, u.vip  FROM `user` u LEFT JOIN `point` p ON u.id = p.user AND p.expiryDate > NOW() GROUP BY u.id ORDER BY u.firstName ASC, u.lastName ASC, u.email ASC LIMIT 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: u
         type: ALL
possible_keys: PRIMARY,username,email,ssoId,token,referralCode
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 2
        Extra: Using temporary; Using filesort
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: p
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1
        Extra: Using where; Using join buffer (Block Nested Loop)
2 rows in set (0.01 sec)

我认为问题是ORDER BY?删除它可以加快速度。但是我该如何优化呢?

更新

我设法像

那样优化查询
SELECT u.id, u.firstName, u.lastName, u.email, u.ssoProfile, u.vip, SUM(p.number) AS totalPoints
FROM (
    SELECT u.id
    FROM user u
    ORDER BY u.firstName ASC, u.lastName ASC, u.email ASC
    LIMIT 460000, 10
) u2
INNER JOIN user u
ON u2.id = u.id
LEFT JOIN `point` p
ON u.id = p.user
AND p.expiryDate > NOW()
GROUP BY u.id;

该子查询可以使用firstName, lastName, email上的复合索引。我还在p.expireDatep.user添加了索引。那个子查询被激发了#34; http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/

0 个答案:

没有答案
相关问题