服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 一个例子!教您彻底理解索引的最左匹配原则!

一个例子!教您彻底理解索引的最左匹配原则!

2023-11-07 01:00未知服务器之家 Mysql

最左匹配原则的定义 简单来讲:在联合索引中,只有左边的字段被用到,右边的才能够被使用到。我们在建联合索引的时候,区分度最高的在最左边。 简单的例子 创建一个表 CREATE TABLE `user` (`id` INT NOT NULL AUTO_INCREMENT,`code` VARCHAR

一个例子!教您彻底理解索引的最左匹配原则!

最左匹配原则的定义

简单来讲:在联合索引中,只有左边的字段被用到,右边的才能够被使用到。我们在建联合索引的时候,区分度最高的在最左边。

简单的例子

创建一个表

CREATE TABLE `user` (
`id` INT NOT NULL AUTO_INCREMENT,
`code` VARCHAR(20) COLLATE utf8mb4_bin DEFAULT NULL,
`age` INT DEFAULT '0',
`name` VARCHAR(30) COLLATE utf8mb4_bin DEFAULT NULL,
`height` INT DEFAULT '0',
`address` VARCHAR(30) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_code_age_name` (`code`,`age`,`name`),
KEY `idx_height` (`height`)
)

建立联合索引:idx_code_age_name。

该索引字段的顺序是:

code

age

name

然后插入一组数据。

INSERT INTO 数据库.`user` (id,CODE,age,NAME,height,address) VALUES(DEFAULT,'1002',40,'kevin',180,'北京市');

以下会走索引。

select * from user where code='1002';
select * from user where code='1002' and age=40
select * from user where code='1002' and age=401 and name='kevin';
select * from userwhere code = '1002' and name='kevin';

我们通过 EXPLAIN加上面的任意语句执行。

EXPLAIN SELECT * FROM USER WHERE CODE = '1002' AND NAME='kevin';

都会看到 type值 为ref。

一个例子!教您彻底理解索引的最左匹配原则!

以下不会走索引。

select * from user where age=21;
select * from user where name='Kevin';
select * from user where age=21 and name='Kevin';

我们通过 EXPLAIN加上面的任意语句执行,会看到type值为all。

一个例子!教您彻底理解索引的最左匹配原则!

大家可以看到where 从code(从左到右依次是:code、age、name)的联合索引,开始查询就会走索引,如果不从code开始就不会走索引!即只有左边的字段被用到,右边的才能够被使用到。

explain 的常用type值

这里先简单的说一下explain,explain即执行计划,使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。

explain 的常用type值含义如下:

  •  "ALL"表示全表扫描,没有使用索引。
  • "index"表示使用了索引,但不是覆盖索引(即查询中使用了索引,但还需要回表获取数据)。
  • "range"表示使用了覆盖索引(即查询中直接从索引中获取了所需数据,无需回表)。
  •  "ref"表示使用了索引(可能是覆盖索引或非覆盖索引),并使用了一个或多个列进行比较。
  •  "eq_ref"表示使用了唯一索引,并且只使用了等于操作符进行比较。

延伸 · 阅读

精彩推荐
  • Mysql浅谈mysql 树形结构表设计与优化

    浅谈mysql 树形结构表设计与优化

    在诸多的管理类,办公类等系统中,树形结构展示随处可见,本文主要介绍了mysql 树形结构表设计与优化,具有一定的参考价值,感兴趣的小伙伴们可以参...

    小码农叔叔5242021-11-16
  • MysqlMySQL锁的知识点总结

    MySQL锁的知识点总结

    在本篇文章里小编给大家整理了关于MySQL锁的知识点总结以及实例内容,需要的朋友们学习下。...

    别人放弃我坚持吖4362020-12-14
  • Mysql解决MySQl查询不区分大小写的方法讲解

    解决MySQl查询不区分大小写的方法讲解

    今天小编就为大家分享一篇关于解决MySQl查询不区分大小写的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Veir_dev5592019-06-25
  • MysqlMySQL 数据备份与还原的示例代码

    MySQL 数据备份与还原的示例代码

    这篇文章主要介绍了MySQL 数据备份与还原的相关知识,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    逆心2972019-06-23
  • Mysql详解MySQL中的分组查询与连接查询语句

    详解MySQL中的分组查询与连接查询语句

    这篇文章主要介绍了MySQL中的分组查询与连接查询语句,同时还介绍了一些统计函数的用法,需要的朋友可以参考下 ...

    GALAXY_ZMY5442020-06-03
  • Mysqlmysql 不能插入中文问题

    mysql 不能插入中文问题

    当向mysql5.5插入中文时,会出现类似错误 ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column ...

    MYSQL教程网5722019-11-25
  • MysqlMySQL数据库varchar的限制规则说明

    MySQL数据库varchar的限制规则说明

    本文我们主要介绍了MySQL数据库中varchar的限制规则,并以一个实际的例子对限制规则进行了说明,希望能够对您有所帮助。 ...

    mysql技术网4192019-11-23
  • MysqlERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event()

    ERROR: Error in Log_event::read_log_event(): read error, data_len: 438, event_type: 2 ...

    MYSQL教程网6412020-03-13