Jul*_*oux 30 mysql indexing sql-order-by
这是我永远的问题.
据我所知,指数的顺序很重要.所以索引就像[first_name, last_name]
是不一样了[last_name, first_name]
吧?
如果我只定义第一个索引,它是否意味着它只用于
SELECT * FROM table WHERE first_name="john" AND last_name="doe";
Run Code Online (Sandbox Code Playgroud)
而不是
SELECT * FROM table WHERE last_name="doe" AND first_name="john";
Run Code Online (Sandbox Code Playgroud)
由于我使用的是ORM,因此我不知道这些列的调用顺序.这是否意味着我必须在所有排列上添加索引?如果我有一个2列索引,这是可行的,但如果我的索引在3或4列上会发生什么?
Chs*_*y76 49
当您的查询条件仅适用于索引的PART时,索引顺序很重要.考虑:
SELECT * FROM table WHERE first_name="john" AND last_name="doe"
SELECT * FROM table WHERE first_name="john"
SELECT * FROM table WHERE last_name="doe"
如果您的索引是(first_name
,last_name
)查询1和2将使用它,查询#3将不会.如果你的索引是(last_name
,first_name
)查询1和3将使用它,查询#2将不会.在任何一种情况下,更改WHERE子句中的条件顺序都不起作用.
细节在这里
更新:
如果上述情况不明确 - 如果查询条件中的列形成索引的最左前缀,MySQL只能使用索引.上面的查询#2不能使用(last_name
,first_name
)索引,因为它仅基于first_name
并且first_name
不是(last_name
,first_name
)索引的最左前缀.
查询中的条件顺序无关紧要; 上述查询#1将能够使用(last_name
,first_name
)指数就好,因为它的条件 first_name
和last_name
与合在一起,它们DO形成(的最左前缀last_name
,first_name
)指数.