【发布时间】:2016-02-14 16:46:11
【问题描述】:
查询:
SELECT
m.*,
mic.*
FROM
members m,
members_in_class_activities mic
WHERE
m.id = mic.member_id AND
mic.not_cancelled = '1' AND
mic.class_activity_id = '32' AND
mic.date = '2016-02-14' AND
mic.time = '11:00:00'
ORDER BY
mic.reservation_order
表 members 有大约 10 万条记录,而表 members_in_class_activities 有大约 30 万条记录。结果集只有 2 条记录。 (不是 2k,只有 2 个。)
所有相关列均已编入索引(id 和 reservation_order 为主):member_id, not_cancelled, class_activity_id, date, time。
还有class_activity_id + member_id + date + time + not_cancelled 的唯一键。 not_cancelled 是 NULL 或 '1'。
所有其他查询都非常快(1-5 毫秒),但这个非常慢:600-1000 毫秒。
什么没有帮助:
- 只选择 2 个主键而不是
*(0 % 变化) - 一个真正的
JOIN,而不是一个隐式连接(它实际上似乎稍微慢了一点,但可能不是)(0 % 变化) - 完全移除与
members的连接使其稍微更快(15 % 变化)
什么有很大帮助:
- 删除主键上的 ORDER BY(99% 变化)
我只有两个问题:
- 什么????
- 我如何仍然
ORDER BY x,但也让它变得更快?我真的需要单独的专栏吗?
我在我的开发机器上运行 10.1.9-MariaDB,但在生产的 MySQL 5.5.27-log 上也很慢。
【问题讨论】:
-
SHOW CREATE TABLE。一个猜测 - 你正在混合VARCHARs和数字。
标签: mysql sql-order-by mariadb