我对我的数据库有一个查询:
SELECT * FROM expenses WHERE user_id = ? AND dated_on = ?
我在user_id
和dated_on
列上添加了一个索引.当我使用检查索引时SHOW INDEXES FROM expenses
,有两行 - 一行的seq_in_index
值为1,另一行的seq_in_index
值为2.
我的问题是,如果我然后提交一个只使用两个WHERE子句中的一个的查询,例如:
SELECT * FROM expenses WHERE user_id = ?
创建另一个仅对user_id
列进行索引的索引有什么好处,或者上面描述的user_id
/ dated_on
index是否同样有效使用?
最后,如果使用查询怎么样:
SELECT * FROM expenses WHERE dated_on = ?
seq_in_index
在这种情况下,2 的值如何影响索引的使用和性能?
MySQL可以使用索引的任何左侧部分.
在您的示例SELECT * FROM expenses WHERE user_id = ?
中将使用索引但SELECT * FROM expenses WHERE dated_on = ?
不会.
对于3列索引A,B,C,WHERE A = ? AND B = ?
将使用A和B上的索引,但WHERE A = ? AND C = ?
仅使用A上的索引
如果user_id和dated_on上的索引确实按此顺序(user_id优先),那么它也将用于user_id查询.您可以使用EXPLAIN进行检查以查看查询的实际策略.