关于MySQL的索引之最左前缀优化详解

关于MySQL的索引最左前缀优化,在这里为大家详细讲解一下。

什么是索引最左前缀优化?

MySQL的索引最左前缀优化指的是当一个组合索引被查询时,只有最左边的索引被使用了,其他索引(当然是在此左侧的索引)则未被使用。

何时使用?

当你有多列,同时要使用这些列作为查询条件时,你可能需要用到组合索引。此时,你可以通过对这些列的升序或降序排列创建一个组合索引。在查询时,可以使用组合索引 covering。这种方式可以大大提高查询性能。

怎么使用?

在创建组合索引时,应该将索引的列以最左前缀的顺序进行排列。这样做有什么好处呢?其实就是可以最大化利用索引的提供效率。

举例说明

示例1:有表A,有以下两个索引,分别为组合索引和普通索引

CREATE TABLE `A` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT '',
  `type` varchar(255) DEFAULT '',
  `value` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `idx_name_type` (`name`,`type`),
  KEY `idx_value` (`value`)
) ENGINE=InnoDB;

现在我们做查询:

SELECT id FROM A WHERE name='xxx' AND type='yyy';

建议创建如上述组合索引“idx_name_type”,它可以大大提高执行效率,同时这个组合索引可以满足等值查询、范围查询和排序功能。

示例2:还是上面的表A,现在我们想要查询“name”为"xxx"或"value"大于100的所有记录

SELECT id FROM A WHERE name='xxx' OR value>100;

这个查询我们可以使用普通索引“idx_value”, 做到“value”这个列的索引扫描,这个案例我们就不需要对“name”列的索引进行扫描了。

示例3:还是上面的表A,现在我们想要查询“name”为"xxx"或"value"大于100的所有记录,但我们对“name”列还想要排序

SELECT id FROM A WHERE name='xxx' OR value>100 ORDER BY name DESC;

如果我们仍然直接使用“idx_value”普通索引的话,那么我们在这个查询中用到的“name DESC”排序就会由MySQL 强制我们执行文件排序或者使用temp表来保存中间计算的结果。这样的做法会很耗费资源,极大降低查询效率!因此,在这个查询中,建议我们使用组合索引“idx_name_type”。

综上所述,我们在对MySQL的组合索引做优化时,应该借助索引最左前缀原则,尽可能从组合索引的最左侧开始匹配,才能最大化利用索引的优势。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于MySQL的索引之最左前缀优化详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 关于SQL注入中文件读写的方法总结

    标题:关于SQL注入中文件读写的方法总结 首先,需要说明的是SQL注入是一种非常危险的攻击方式,它允许攻击者获取或修改目标系统中的敏感信息。其中一种比较常见的攻击就是利用SQL注入来读取或写入文件,本文将对此进行详细讲解。 文件读取 一、通过UNION语句读取文件内容 在进行SQL注入测试时,我们可以通过构造UNION语句来获取文件内容。具体步骤如下: 首先…

    database 2023年5月21日
    00
  • PouchDB 和 MongoDB 的区别

    PouchDB 和 MongoDB 都是流行的 NoSQL 数据库,但是它们有不同的用途和功能。下面我们详细讲解它们的区别。 1. 数据存储方式 MongoDB 是一个传统的服务器端数据库,它使用纯粹的基于磁盘的存储方式,即将数据写入硬盘中的文件中。MongoDB 核心的思想是将数据存储在集合(Collections)中,这些集合可以通过索引来查找。Mong…

    database 2023年3月27日
    00
  • 通过Shell脚本批量创建服务器上的MySQL数据库账号

    下面是通过Shell脚本批量创建服务器上的MySQL数据库账号的完整攻略。 一、前提条件 在执行Shell脚本批量创建MySQL数据库账号之前,需要满足以下前提条件: 在服务器上安装MySQL数据库,并拥有root用户权限; 已经安装并配置好MySQL客户端程序(mysql和mysqladmin); 已经创建好目标数据库,并准备好数据库授权方式和授权对象。 …

    database 2023年5月22日
    00
  • MySql报错Table mysql.plugin doesn’t exist的解决方法

    针对“MySql报错Table mysql.plugin doesn’t exist的解决方法”的问题,下面是一些解决方法: 问题描述 MySQL客户端报错Table mysql.plugin doesn’t exist,这个问题通常是因为MySQL数据库实例升级或者版本兼容性问题导致的。 解决方法1:使用mysql_install_db初始化MySQL m…

    database 2023年5月18日
    00
  • PHP7.3.4安装redis扩展

    1、本地redis的安装        https://blog.csdn.net/pyp_demon/article/details/106571229 2、下载php7.3 对应的redis 扩展dll 文件       https://windows.php.net/downloads/pecl/snaps/redis/4.2.0/ 3、将php_re…

    Redis 2023年4月12日
    00
  • 【Redis场景5】集群秒杀优化-分布式锁

    【Redis场景5】集群秒杀优化-分布式锁,基于Redis的分布式锁的实现及锁误删问题的解决方式 集群环境下的秒杀问题 前序 【Redis场景1】用户登录注册 【Redis场景2】缓存更新策略(双写一致) 【Redis场景3】缓存穿透、击穿问题 【Redis场景拓展】秒杀问题-全局唯一ID生成策略 【Redis场景4】单机环境下秒杀问题 在单机环境下的并发问…

    Redis 2023年4月10日
    00
  • MySQL慢查询优化解决问题

    下面就是MySQL慢查询优化解决问题的完整攻略。 1. 什么是MySQL慢查询? MySQL慢查询是指在执行SQL语句时,因为某些原因导致查询速度变慢,需要花费较长的时间才能返回结果。一般来说,执行时间超过1秒的语句就可以被认为是慢查询。慢查询可能是由于索引不当、SQL语句不合理、数据量过大等原因造成的,需要进行优化。 2. 如何优化MySQL慢查询? 优化…

    database 2023年5月19日
    00
  • Docker下mysql设置字符集的方法

    你好,关于Docker下mysql设置字符集的方法,以下是完整攻略: 1. 在Docker镜像中添加locale 在Dockerfile中添加以下语句: RUN apt-get update && apt-get install -y locales \ && echo "en_US.UTF-8 UTF-8&quot…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部