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_nameage创建了一个复合索引。

考虑以下查询:

  1. 根据first_name查询:sqlCopy codeSELECT * FROM users WHERE first_name = 'John'; 这个查询可以使用idx_name_age索引的最左列。
  2. 根据first_namelast_name查询:sqlCopy codeSELECT * FROM users WHERE first_name = 'John' AND last_name = 'Doe'; 这个查询可以使用idx_name_age索引的前两列。
  3. 根据first_name, last_nameage查询:sqlCopy codeSELECT * FROM users WHERE first_name = 'John' AND last_name = 'Doe' AND age = 30; 这个查询可以使用整个idx_name_age索引。

但是,考虑以下查询:

  1. 只根据last_name查询:sqlCopy codeSELECT * FROM users WHERE last_name = 'Doe'; 这个查询不能使用idx_name_age索引,因为它跳过了最左边的first_name列。
  2. 根据last_nameage查询:sqlCopy codeSELECT * FROM users WHERE last_name = 'Doe' AND age = 30; 同样,这个查询也不能充分利用idx_name_age索引,因为它跳过了最左边的first_name列。

因此,当为表设计复合索引时,要考虑查询的最常见模式,并确保最常用的列位于复合索引的最左边。这样可以确保索引在大多数查询中都被有效地使用。