简单了解添加mysql索引的3条原则

下面我将详细讲解如何根据三条原则为MySQL表添加索引:

什么是MySQL索引

在进行MySQL查询时,如果MySQL没有为表添加索引,那么查询语句执行时就会进行全表扫描,这会导致查询效率极低。而添加索引可以让MySQL在进行查询时只搜索索引列,从而提高查询效率。因此,我们可以将索引看作是对数据库中某一列或多列的引用,可以提高查询速度。

三条原则

1. 最左前缀匹配原则

在 MySQL 中,使用索引时必须从最左前缀列开始匹配,如果不是最左前缀列匹配,那么该索引将不可用。

比如,我们有一个表users,包含三列:id、name、email,我们想要通过name和email两列进行查询,因此我们需要添加一个联合索引。但必须遵守最左前缀匹配原则,如果索引是(name, email),则查询"WHERE email='123@qq.com'"是可用索引的,而查询"WHERE name='Tom'"不是可用索引的,因为name列不是最左前缀列。

2. 索引列上不能有函数 or 运算符

如果查询语句中的索引列上使用了函数或运算符,MySQL 将不会使用该索引。

比如,我们有一个表orders,包含列price,我们想要查询 price0.8 的结果小于 100 的所有行,如果添加索引(price),MySQL 将不会使用该索引,而进行全表扫描查找,因为 price0.8 不是索引列price上的值。

3. 小范围列先

如果存在两个列作为条件进行查询,那么可以采用最小范围的列作为索引列。

比如,我们有一个表product,包含两列:id和name,我们想要查询id=100,并且name like '%test%'的所有行。如果添加索引(id, name),MySQL 将会使用该索引,因为id是小范围的列,查询结果的范围比name列更小,因此应该使用id作为索引列。

示例说明

示例1:

假设我们有一个表book,包含五列:id、name、author、price、publish_time。现在我们需要通过name和author两列进行查询,因此需要添加一个联合索引。我们可以通过以下命令添加:

ALTER TABLE `book` ADD INDEX `name_author` (`name` ASC, `author` ASC);

示例2:

假设我们有一个表order,包含五列:id、user_id、status、total_price、create_time。我们需要查找create_time是2019年8月份,且status是‘已发货’的所有订单。那么我们需要添加联合索引并且按照以下方式添加:

ALTER TABLE `order` ADD INDEX `multi_idx` (`status` ASC, `create_time` ASC);

在添加该索引后,我们进行查询时,MySQL 会先使用status列过滤出相应的记录,再使用create_time过滤,从而提高查询效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单了解添加mysql索引的3条原则 - Python技术站

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

相关文章

  • mySQL建表及练习题(上)

          create table student( sno varchar(20)not null primary key, sname varchar(20)not null, ssex varchar(20)not null, sbirthday datetime null, class varchar(20)null ); insert into …

    MySQL 2023年4月13日
    00
  • SQL SERVER使用表分区优化性能

    以下是“SQL SERVER使用表分区优化性能”的完整攻略: 什么是表分区 表分区是将表中数据分散到多个磁盘上以提高数据库的查询和维护性能。通俗地讲,数据会被存储到多个磁盘上,分成多个小区域,这样查询时就可以只查找部分数据,大大加快了查询的速度。 表分区的特点 分区后的表具有独立的数据存储空间,提高了IO并发性 支持表或索引分区 查询时只查找需要的分区,减少…

    database 2023年5月21日
    00
  • 详解Laravel5.6 Passport实现Api接口认证

    详解Laravel5.6 Passport实现Api接口认证 在上线的Web应用中,如何保证用户使用的安全性?通常我们需要考虑到用户的认证。在很多情况下,应用对外提供了API接口,我们需要在每个请求中都进行认证,才能保证数据的安全性。这篇文章将通过Laravel的Passport套件充分讲解如何实现API接口认证,为我们的应用增加认证安全性。 安装Passp…

    database 2023年5月22日
    00
  • 微服务架构-利用Redis特性进行业务解耦

    背景: 接着上篇文章来,上篇文章讲的是如何利用ApplicationContext的事件机制来达到业务解耦,而且这只能作用在单体应用中。在当下这么盛行的微服务架构中,想要再利用此方案做业务解耦是不可能的了,我们也提到,现在比较流行的解决方案是利用消息队列来完成,例如现在流行的RabbitMQ、RocketMQ、ActiveMQ,Kafka。    当然了,我…

    Redis 2023年4月11日
    00
  • mysql update语句的用法详解

    下面是关于“mysql update语句的用法详解”的攻略。 什么是MySQL Update语句 MySQL Update语句是MySQL中一种用于更改数据的操作语句。它用来更新一个或多个已存在的行的数据。 MySQL Update语句的语法 UPDATE table_name SET column1 = value1, column2 = value2 W…

    database 2023年5月21日
    00
  • linux每天定时备份数据库并删除十天前数据详细步骤

    下面是针对“linux每天定时备份数据库并删除十天前数据”的详细攻略步骤: 1. 安装crontab 在linux系统下,定时任务可以使用crontab来实现。如果你的系统中没有安装crontab,则需要先安装。 使用以下命令来安装crontab: sudo apt-get install crontab 2. 编写备份脚本 首先,需要编写一个可以备份数据库…

    database 2023年5月22日
    00
  • php运行提示Can’t connect to MySQL server on ‘localhost’的解决方法

    “Can’t connect to MySQL server on ‘localhost’” 是 PHP 连接 MySQL 数据库时常见的错误之一。以下是解决这个问题的详细攻略,包括两条示例说明。 1. 检查 MySQL 服务器是否在运行 首先,这个错误可能是由于 MySQL 服务器没有运行引起的。因此,需要检查 MySQL 服务器是否在运行。以下是检查 M…

    database 2023年5月22日
    00
  • java使用@Transactional时常犯的N种错误

    针对这个问题,我将按照以下步骤进行讲解: 介绍@Transactional注解的作用和使用场景 总结java使用@Transactional经常犯的错误 示例说明常见的@Transactional错误 1. @Transactional注解的作用和使用场景 @Transactional注解是Spring框架中的注解,主要用于表示某个方法需要被事务管理器进行事…

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