MySQL联合索引遵循最左前缀匹配原则

MySQL联合索引采用最左前缀匹配原则,即查询条件从左至右匹配索引中的字段。

深入理解MySQL联合索引的最左前缀匹配原则

在MySQL数据库中,联合索引是一种非常重要的索引类型,可以有效地提高查询性能,很多开发者在创建和使用联合索引时,往往忽视了最左前缀匹配原则,导致索引效果不佳,本文将详细讲解MySQL联合索引的最左前缀匹配原则,并通过实例进行分析,帮助大家更好地理解和应用这一原则。

MySQL联合索引遵循最左前缀匹配原则

联合索引简介

联合索引,又称复合索引,是指在一个索引定义中包含多个列的索引,与单一索引相比,联合索引可以覆盖更多的查询场景,提高查询性能。

创建联合索引的语法如下:

CREATE INDEX index_name ON table_name (column1, column2, ...);

index_name表示索引名称,table_name表示表名称,column1, column2, ...表示组成联合索引的列。

最左前缀匹配原则

最左前缀匹配原则是指在使用联合索引进行查询时,遵循从左到右的顺序使用索引列,具体来说,以下几种情况会触发最左前缀匹配:

1、查询条件包含联合索引的所有列。

对于以下联合索引:

CREATE INDEX idx_user_age_name ON user (age, name);

以下查询会触发最左前缀匹配:

SELECT * FROM user WHERE age = 30 AND name = 'zhangsan';

2、查询条件包含联合索引的前缀列。

SELECT * FROM user WHERE age = 30;

3、查询条件包含联合索引的前缀列,并且后续列有范围查询。

SELECT * FROM user WHERE age = 30 AND name LIKE 'zhangsan%';

以下情况不会触发最左前缀匹配:

1、查询条件不包含联合索引的最左列。

SELECT * FROM user WHERE name = 'zhangsan';

2、查询条件包含联合索引的列,但顺序与索引定义不一致。

MySQL联合索引遵循最左前缀匹配原则

SELECT * FROM user WHERE name = 'zhangsan' AND age = 30;

实例分析

为了更好地理解最左前缀匹配原则,我们通过以下实例进行分析。

1、创建测试表

CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    age INT,
    name VARCHAR(50),
    address VARCHAR(100)
);

2、创建联合索引

CREATE INDEX idx_user_age_name ON user (age, name);

3、插入测试数据

INSERT INTO user (age, name, address) VALUES (20, 'zhangsan', '北京');
INSERT INTO user (age, name, address) VALUES (30, 'lisi', '上海');
INSERT INTO user (age, name, address) VALUES (30, 'zhaowu', '广州');
INSERT INTO user (age, name, address) VALUES (40, 'zhangsan', '深圳');

4、查询分析

(1)查询条件包含联合索引的所有列

EXPLAIN SELECT * FROM user WHERE age = 30 AND name = 'zhaowu';

查询计划如下:

id  select_type  table  type  possible_keys  key  key_len  ref  rows  filtered  Extra
1   SIMPLE       user   ref   idx_user_age_name  idx_user_age_name  76  const,const  1   100.00  Using index

从查询计划可以看出,MySQL使用了联合索引idx_user_age_name,并且使用了最左前缀匹配。

(2)查询条件包含联合索引的前缀列

EXPLAIN SELECT * FROM user WHERE age = 30;

查询计划如下:

id  select_type  table  type  possible_keys  key  key_len  ref  rows  filtered  Extra
1   SIMPLE       user   ref   idx_user_age_name  idx_user_age_name  5   const  3   33.33  Using index condition

从查询计划可以看出,MySQL使用了联合索引idx_user_age_name的前缀列,即age列。

(3)查询条件包含联合索引的前缀列,并且后续列有范围查询

MySQL联合索引遵循最左前缀匹配原则

EXPLAIN SELECT * FROM user WHERE age = 30 AND name LIKE 'zhangsan%';

查询计划如下:

id  select_type  table  type  possible_keys  key  key_len  ref  rows  filtered  Extra
1   SIMPLE       user   range  idx_user_age_name  idx_user_age_name  76  NULL  1   25.00  Using index condition

从查询计划可以看出,MySQL使用了联合索引idx_user_age_name的前缀列,并且对后续列name进行了范围查询。

(4)查询条件不包含联合索引的最左列

EXPLAIN SELECT * FROM user WHERE name = 'zhangsan';

查询计划如下:

id  select_type  table  type  possible_keys  key  key_len  ref  rows  filtered  Extra
1   SIMPLE       user   ALL   NULL  NULL  NULL  NULL  4   25.00  Using where

从查询计划可以看出,MySQL没有使用联合索引idx_user_age_name,而是进行了全表扫描。

本文详细介绍了MySQL联合索引的最左前缀匹配原则,并通过实例进行了分析,在实际开发中,我们需要遵循以下原则:

1、创建联合索引时,应按照查询条件中出现频率和过滤效果的优先级来确定索引列的顺序。

2、使用联合索引进行查询时,应确保查询条件包含联合索引的最左列,以提高查询性能。

3、避免创建不必要的联合索引,以免增加数据库的维护成本。

掌握最左前缀匹配原则,可以帮助我们更好地优化MySQL查询性能,提高数据库的整体效率。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/322767.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-02-18 19:02
Next 2024-02-18 19:06

相关推荐

  • MariaDB中怎么执行查询操作

    在MariaDB中执行查询操作,可以使用SELECT语句,结合WHERE子句进行筛选,使用ORDER BY子句进行排序。

    2024-05-21
    0108
  • 如何实现MySQL数据库的高效安全加密?

    MySQL数据库加密可以通过使用内置的AES_ENCRYPT和AES_DECRYPT函数来实现。这些函数允许您在存储和检索数据时对其进行加密和解密。还可以使用SSL/TLS协议来保护数据传输过程中的安全。

    2024-08-13
    045
  • 一篇文章带你了解mysql索引下推荐的内容

    MySQL索引下推是一种优化技术,它可以显著提高查询性能,在这篇文章中,我们将详细介绍MySQL索引下推的原理、实现方式以及如何利用它来优化查询。MySQL索引下推的原理MySQL索引下推(Index Condition Pushdown,简称ICP)是一种将查询条件从服务器端移动到存储引擎端的优化技术,在传统的查询过程中,MySQL……

    2024-02-27
    0169
  • mysql中的日期

    MySQL中的日期类型有五种:DATE、DATETIME、TIMESTAMP、YEAR和NEWDATE。DATE类型用于存储没有时间的日期,格式为'YYYY-MM-DD';DATETIME类型用于存储日期和时间,格式为'YYYY-MM-DD HH:MM:SS';TIMESTAMP类型用于存储日期和时间戳,格式为'YYYY-MM-DD HH:MM:SS';YEAR类型用于存储年份,格式为'YYYY';NEWDATE类型用于存储日期,格式为'YYYY-MM-DD' 。

    2024-01-25
    0177
  • 如何评估MySQL MHA方案的可靠性和性能?

    MySQL MHA(Master High Availability)是一种用于实现MySQL高可用性和故障切换的开源解决方案。它通过监控主数据库的状态,当主数据库发生故障时,能够自动将一个从数据库提升为新的主数据库,从而实现数据库的高可用性。

    2024-08-12
    036
  • mysql如何查看数据表有哪些属性值

    在MySQL中,可以通过查询information_schema数据库中的COLUMNS表来查看数据表的属性,COLUMNS表包含了数据库中所有表的列信息,包括列名、数据类型、是否允许为空等,以下是一个查询示例:SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE. 将your_database_name和your_table_name替换为实际的数据库名和表名

    2023-12-09
    0350

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入