来自手册 使用索引条件;使用地点:
通过访问索引元组并对其进行初始测试,表可以 阅读时推迟读取整行,直到有必要为止。
我有以下表格列:
attendance_in_date
:日期attendance_out_date
:日期attendance_user_id
:BIGINTattendance_headquarter_id
:BIGINT以下
WHERE
适用(?
表示可选条件):
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
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
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 和索引有什么想法吗?
拥有一个索引,所有 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
称为“覆盖”,由“使用索引”表示。