MySQL的最左匹配原则

        MySQL 索引的最左匹配原则:在使用复合索引进行查询时,索引的前缀必须被使用,否则索引将无法起作用。具体来说,如果有一个由 (a,b,c) 组成的复合索引,则在查询时必须先使用 a 进行过滤,然后才能使用 b 或 c 进行过滤,即使 b 或 c 也属于索引的一部分。

        这个原则的实际含义是:当我们查询的条件包含多个字段时,如果建立了多列组合索引,那么 MySQL 只会使用该索引中最左边的列作为索引键,从而定位到第一个匹配的行,然后再逐个匹配剩余条件。因此,如果不按照索引建立顺序来定义 WHERE 子句,那么 MySQL 将无法利用多列索引,而需要进行全表扫描,对性能将产生很大的影响。

举个例子,比如说我们有以下的表结构:

CREATE TABLE student (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender ENUM('male', 'female') NOT NULL,
    age INT NOT NULL,
    score FLOAT NOT NULL,
    INDEX idx_name_gender_age(name, gender, age)
);

        这个表有一个复合索引 idx_name_gender_age,包含了三个列:name、gender 和 age。如果我们想查询所有女生中年龄小于 20 岁的学生信息,正确的查询语句应该是这样的:

SELECT *
FROM student
WHERE gender = 'female' AND age < 20;

        MySQL 使用最左原则,会发现可以直接使用索引中的前两个列 gender 和 age 进行过滤,因此会利用索引进行查询。如果我们换一下条件的顺序,改为先根据 age 再根据 gender 进行过滤,就会失去索引的效果,导致 MySQL 需要对整张表进行扫描。

        因此,建立复合索引时需要注意索引列的顺序,尽量将被频繁过虑的列放在前面。

猜你喜欢

转载自blog.csdn.net/weixin_52060913/article/details/130615245