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

yizhihongxing

关于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 – CREATE 语句

    关于SQL-CREATE语句的完整攻略可以从以下几个方面入手。 1. CREATE语句的基本语法 CREATE语句被用来在数据库中创建一个新的表。其基本语句格式如下: CREATE TABLE 表名 ( 列1 数据类型, 列2 数据类型, 列3 数据类型, … ); 其中,表名指定了新表的名称,列1、列2、列3等表示了新表中的列,数据类型则指定了每个列中…

    database 2023年3月27日
    00
  • SQL Server 公用表表达式(CTE)实现递归的方法

    下面是SQL Server公用表表达式(CTE)实现递归的完整攻略。 什么是公用表表达式(CTE) 公用表表达式(CTE)是一个临时命名的结果集,它定义在一个 SQL 语句内并且能被这个语句后面的其他语句引用。CTE可以看作是一种特殊的临时表,在语法上与普通的SELECT查询有些类似,但CTE比SELECT查询多了很多特性。 为什么要使用公用表表达式(CTE…

    database 2023年5月21日
    00
  • Linux给普通用户加超级用户权限的方法

    给普通用户加超级用户权限的方法通常有两种方式:使用sudo命令和使用su命令。 使用sudo命令 首先需要在超级用户下开启sudo权限,可以使用以下命令: $ su – # visudo 在打开的文件中找到以下内容: ## Allow root to run any commands anywhere root ALL=(ALL) ALL 在该行下方添加以下…

    database 2023年5月22日
    00
  • 如何使用Python删除数据库中的数据?

    当需要从数据库中删除数据时,可以使用Python连接到数据库并执行SQL删除语句。以下是使用Python删除数据库中的数据的完整攻略: 连接数据库 要连接到数据库,需要提供数据库的主机名、用户名、和数据库名称。可以使用以下代码连接MySQL: import mysql.connector mydb = mysql.connector.connect( hos…

    python 2023年5月12日
    00
  • Window server中安装Redis的超详细教程

    下面是在Windows Server系统中安装Redis的超详细教程: 1. 下载Redis Installer并安装 首先,需要从官网下载Redis Installer: https://github.com/rgl/redis/downloads 下载时建议选择最新版本的Redis,并下载兼容性最好的msi文件。 下载后,双击Redis Installe…

    database 2023年5月22日
    00
  • Javascript new Date().valueOf()的作用与时间戳由来详解

    JavaScript中的new Date().valueOf()用于获取当前时间的时间戳。时间戳指的是自1970年1月1日00:00:00 UTC(世界标准时间)起至当前时间的毫秒数。JavaScript使用时间戳来表示日期和时间,这个时间戳也称为Epoch时间。 JavaScript中的new Date().valueOf()返回的是一个数值,该数值表示1…

    database 2023年5月21日
    00
  • MySQL服务器的启动和关闭

    MySQL服务器的启动和关闭是使用MySQL数据库的基本操作之一。下面是详细的启动和关闭MySQL服务器的攻略: 启动MySQL服务器 启动MySQL服务器的步骤如下: 1.确保MySQL服务器已经安装并且已经运行。 2.打开终端或命令行窗口,输入以下命令: sudo /usr/local/mysql/support-files/mysql.server s…

    database 2023年5月22日
    00
  • MySQL中的用户创建与权限管理

    MySQL中的用户创建与权限管理 在MySQL中,用户创建和权限管理是非常重要的操作,本篇文章将详细介绍如何创建用户和管理权限。 1. 创建用户 创建用户需要使用CREATE USER语句,其语法如下: CREATE USER ‘username’@’host’ IDENTIFIED BY ‘password’; 其中,’username’是用户的名称,’h…

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