这个MySQL查询的最佳复合索引是什么?

时间:2016-10-15 20:24:57

标签: mysql optimization indexing database-indexes

这个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';

1 个答案:

答案 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