MySQL的索引使用“最左前缀匹配”原则,也称为“最左匹配原则”。这意味着,当你有一个复合索引(包括多个列)时,你可以搜索该索引的最左边的一列、前两列、前三列等,但是不能跳过最左边的任何列。下面通过一些例子来解释这个原则。
假设有如下表结构:
CREATE TABLE users ( id INT PRIMARY KEY, first_name VARCHAR(255), last_name VARCHAR(255), age INT, INDEX idx_name_age (first_name, last_name, age) );
在这里,我们为first_name
, last_name
和age
创建了一个复合索引。
考虑以下查询:
- 根据
first_name
查询:sqlCopy codeSELECT * FROM users WHERE first_name = 'John';
这个查询可以使用idx_name_age
索引的最左列。 - 根据
first_name
和last_name
查询:sqlCopy codeSELECT * FROM users WHERE first_name = 'John' AND last_name = 'Doe';
这个查询可以使用idx_name_age
索引的前两列。 - 根据
first_name
,last_name
和age
查询:sqlCopy codeSELECT * FROM users WHERE first_name = 'John' AND last_name = 'Doe' AND age = 30;
这个查询可以使用整个idx_name_age
索引。
但是,考虑以下查询:
- 只根据
last_name
查询:sqlCopy codeSELECT * FROM users WHERE last_name = 'Doe';
这个查询不能使用idx_name_age
索引,因为它跳过了最左边的first_name
列。 - 根据
last_name
和age
查询:sqlCopy codeSELECT * FROM users WHERE last_name = 'Doe' AND age = 30;
同样,这个查询也不能充分利用idx_name_age
索引,因为它跳过了最左边的first_name
列。
因此,当为表设计复合索引时,要考虑查询的最常见模式,并确保最常用的列位于复合索引的最左边。这样可以确保索引在大多数查询中都被有效地使用。