“使用索引条件;使用where”解释我的查询,并使用适当的索引?

问题描述 投票:0回答:1

来自手册 使用索引条件;使用地点

通过访问索引元组并对其进行初始测试,表可以 阅读时推迟读取整行,直到有必要为止。

我有以下表格列:

  • attendance_in_date
    :日期
  • attendance_out_date
    :日期
  • attendance_user_id
    :BIGINT
  • attendance_headquarter_id
    :BIGINT

以下

WHERE
适用(
?
表示可选条件):

  • SET 1
    attendance_in_date, attendance_user_id, attendance_headquarter_id?
    =>被
    INDEX in_date_user_id_headquarter_id
    覆盖(覆盖所有列):
EXPLAIN SELECT *
FROM attendance
WHERE 
    attendance_in_date = DATE(NOW()) 
    AND 
    attendance_user_id = 5 
    AND 
    attendance_headquarter_id = 4
  • SET 2
    attendance_in_date, attendance_out_date, attendance_headquarter_id?
    => 由
    INDEX in_date_out_date_headquarter_id
    转换(涵盖所有列)
EXPLAIN SELECT *
FROM attendance
WHERE 
    attendance_in_date = DATE(NOW())
    AND 
    attendance_out_date IS NULL 
    AND 
    attendance_headquarter_id = 4
  • SET 3
    attendance_in_date, attendance_out_date, attendance_user_id, attendance_headquarter_id
    =>无法获取使用索引

SET 3 有问题。无论我尝试创建什么索引,我总是得到 Using index condition;使用哪里。查询示例:

EXPLAIN SELECT *
FROM attendance
WHERE 
    attendance_in_date = DATE(NOW()) 
    AND 
    attendance_out_date IS NULL 
    AND 
    attendance_user_id = 5 
    AND 
    attendance_headquarter_id = 4

关于如何获得 SET 3 和索引有什么想法吗?

sql mysql database database-design query-optimization
1个回答
0
投票

拥有一个索引,所有 4 列按任意顺序排列。

使用单个索引处理所有 3 种情况:

INDEX(in_date, out_date,        -- in either order
      user_id, headquarter_id)  -- in either order

按照我刚刚列出的顺序,它对于案例 1 和 3 来说是“完美”的,而对于案例 2 来说则相当不错。

或者,有两个索引——一个用于处理两种情况,另一个用于“更好”地处理另一种情况:

INDEX(in_date, out_date, headquarter_id)   -- in any order

备注:

  • 如果SELECT中的所有
    anywhere
    都在
    INDEX
    anywhere中,则
    INDEX
    称为“覆盖”,由“使用索引”表示。
  • “使用索引条件”(又名 ICP 或“索引条件下推”)意味着不同的东西——一些处理在一个地方完成,一些处理被“推”到另一个地方。这是“好”,但通常不是“最好”。
© www.soinside.com 2019 - 2024. All rights reserved.