我有一个像这样的查询
SELECT * FROM Table_name WHERE column1 = '1' AND column2 IN ('1','2','3');
并且索引存在于(column1, column2, column3)
. 我上面的查询是否使用了我创建的索引?基本上我对IN
关键字感到困惑,没有它正在使用,但IN
我不确定。请解释一下。
MySQL 可以使用带IN
条件的索引。如果您只有在 上的索引column2
,则很可能会使用它。如果您对每个column1
和都有索引column2
,则只能使用其中一个,查询规划器将必须决定哪个对特定查询更好。如果您有一个复合索引,(column1, column2)
那么它应该能够使用该索引来匹配WHERE
子句中的两列。
MySQL能够使用带有IN
.. 的索引现在, MySQL是否在特定查询中使用索引?好吧,询问查询计划员!
在这种情况下,(column1, column2, ..)
可以使用索引 over - 因为所有左侧组件都已得到满足。也就是说,可以在 column1 (for =
) 上进行索引查找,然后在 column2 (for IN
) 上进行。但是,再次询问查询计划者,因为意想不到的计划并非闻所未闻。仅仅因为查询规划器可以选择一个索引并不意味着它会。
请参阅EXPLAIN,了解如何询问:
当 EXPLAIN 与可解释语句一起使用时,MySQL 显示来自优化器的有关语句执行计划的信息。也就是说,MySQL 解释了它将如何处理该语句,包括有关表如何连接以及以何种顺序连接的信息 [如索引使用]。
.. 在 EXPLAIN 的帮助下,您可以看到应该在哪里为表添加索引,以便通过使用索引查找行来更快地执行语句。