【问题标题】:What would be the best compound index for this MySQL query?这个 MySQL 查询的最佳复合索引是什么?
【发布时间】:2016-10-15 20:24:56
【问题描述】:

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

【问题讨论】:

    标签: mysql optimization indexing database-indexes


    【解决方案1】:

    大概是这样的:

    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 & 'unconfirmed' & 00:00。然后它将对当天的连续条目进行范围扫描。

    然后它会跳到 1234 & 'confirmed' & 00:00 进行另一次扫描。

    这增加了对索引的两个 BTree 探测,以及两个索引扫描。效率很高。

    然后,对于索引中的每一行,它将到达(使用PRIMARY KEY)以获取所需的其他列。

    日期和时间范围的推荐模式:

    AND c.start_datetime >= '2016-10-15'
    AND c.start_datetime  < '2016-10-15' + INTERVAL 1 DAY
    

    【讨论】:

    • 感谢您的回答!这有助于大量调整最终查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2011-03-04
    相关资源
    最近更新 更多