查询:
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
有~100k记录,表members_in_class_activities
有约300k。结果集只有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毫秒。
什么不起作用:
*
(0%更改)JOIN
而不是一个隐式联接(它实际上似乎稍慢,但可能不是)(0%更改)members
完全使稍微更快(15%更改)有什么帮助,非常:
我只有两个问题:
ORDER BY x
,但也要快点?我真的需要一个单独的专栏吗?我在我的开发计算机上运行10.1.9-MariaDB
,但生产的MySQL 5.5.27-log
也很慢。
答案 0 :(得分:3)
不要在主查询中使用order by。试试这个:
SELECT * FROM (
... your query
) ORDER BY mic.reservation_order
正如您所提到的那样members_in_class_activities has about 300k
记录,因此您的订单将适用于所有 300k 记录,这些记录肯定会降低您的查询速度。
答案 1 :(得分:0)
class_activity_id + member_id + date + time + not_cancelled
- 不是最佳的。
以WHERE
开头的任何顺序中的'='字段,然后添加ORDER BY
字段:
INDEX(class_activity_id, date, time, not_cancelled,
reservation_order)
由于您似乎需要UNIQUE
约束,因此通过将member_id
放在最后(它会'不在路上',但是将您的索引洗牌几乎一样好,但是没用过):
UNIQUE(class_activity_id, date, time, not_cancelled, member_id)
一般来说,将date
和time
分开是不好的;为该对建议DATETIME
列。