这个MySQL查询的最佳复合索引是什么?
SELECT
c.id, c.customer_id, c.service_id, c.origin_id, c.title, c.state, c.start_date_time
FROM
calendar_events c
WHERE
c.customer_id = 1234
AND c.state IN ('unconfirmed', 'confirmed')
AND c.start_datetime BETWEEN '2016-10-15 00:00:00' AND '2016-10-15 23:59:59';
答案 0 :(得分:0)
可能这个:
INDEX(customer_id, -- '=' comes first
state, -- 'IN' sometimes works ok in the middle
start_datetime) -- nothing after a 'range' will be used
运行EXPLAIN SELECT ...
它可能会在Other
列中显示“MRR”。我称之为'越级'优化。在您的情况下,它将很容易进入索引行的开始1234& '未经证实'& 00:00。然后它将扫描那天的连续条目。
然后它将跃升至1234& '确认'& 00:00进行另一次扫描。
这会在索引中添加两个BTree探测器,再加上两个索引扫描。这非常有效。
然后,对于索引中的每一行,它将覆盖(使用PRIMARY KEY
)以获取所需的其他列。
日期和时间范围的推荐模式:
AND c.start_datetime >= '2016-10-15'
AND c.start_datetime < '2016-10-15' + INTERVAL 1 DAY