MySQL导致索引失效的几种情况

MySQL导致索引失效的几种情况

在使用MySQL数据库时,我们经常需要利用索引提高查询效率,但是有时候我们发现索引并没有起到预期的作用,这可能是索引被失效了,下面列举了几种常见的MySQL导致索引失效的情况:

  1. 对索引列进行函数操作

如果查询条件中对索引列进行了函数操作,那么MySQL就无法使用这个索引了。

例如下面的查询语句:

SELECT * FROM table WHERE YEAR(create_time) = 2021;

如果create_time上有索引,那么这个索引将无法被使用,因为YEAR(create_time)的操作将会导致索引失效,此时可以考虑将2021也转为日期类型与create_time比较,或者将YEAR(create_time)的结果计算好后作为查询参数传递。

  1. 在联合索引中未按照顺序使用

如果一个表上有多个索引,我们可以考虑使用联合索引提高查询效率。但是,如果我们在联合索引中未按照顺序使用,则索引也会失效。

例如下面的查询语句:

SELECT * FROM table WHERE name = 'John' AND age > 18;

如果表上有一个联合索引(name, age),那么这个索引将无法被使用,因为查询时未按照索引中列的顺序使用。此时可以考虑创建一个(age, name)的索引,或者将查询改为WHERE age > 18 AND name = 'John'。

示例说明:

首先,我们建立一个名为student的表,其结构如下:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `age` int(11) NOT NULL,
  `create_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

接下来,我们向表中插入50000条模拟数据:

SET autocommit=0;
START TRANSACTION;
INSERT INTO student (name, age, create_time) VALUES
('Alex',20,'2021-01-01'),('Bob',23,'2021-01-02'),('Carl',26,'2021-01-03'),
('David',29,'2021-01-04'),('Eric',32,'2021-01-05'),('Frank',35,'2021-01-06'),
('Grace',38,'2021-01-07'),('Helen',41,'2021-01-08'),('Ivy',44,'2021-01-09'),
('Jack',47,'2021-01-10'),('Kelly',50,'2021-01-11'),('Lily',53,'2021-01-12'),
('Mike',56,'2021-01-13'),('Nancy',59,'2021-01-14'),('Oliver',62,'2021-01-15'),
('Paul',65,'2021-01-16'),('Queen',68,'2021-01-17'),('Robert',71,'2021-01-18'),
('Sam',74,'2021-01-19'),('Tracy',77,'2021-01-20'),('Ubaid',80,'2021-01-21'),
('Vivian',83,'2021-01-22'),('Wendy',86,'2021-01-23'),('Xander',89,'2021-01-24'),
('York',92,'2021-01-25'),('Zara',95,'2021-01-26');
INSERT INTO student (name, age, create_time)
SELECT `name`, `age`, DATE_ADD('2021-01-01', INTERVAL `id` DAY) FROM `student`;
COMMIT;

接下来,我们分别演示如何导致索引失效:

  1. 对索引列进行函数操作:

我们使用下面的查询语句查询2021年4月份创建的学生记录:

SELECT * FROM student WHERE YEAR(create_time) = 2021 AND MONTH(create_time) = 4;

可以看到,虽然create_time上有一个索引,但是这个索引无法被使用,因为我们对create_time进行了YEAR和MONTH函数操作:

id  name    age create_time
--------------------------------------------------
909 Alex    20  2021-04-09 00:00:00
911 Carl    26  2021-04-11 00:00:00
913 Eric    32  2021-04-13 00:00:00
915 Grace   38  2021-04-15 00:00:00
917 Ivy 44  2021-04-17 00:00:00
919 Kelly   50  2021-04-19 00:00:00
921 Lily    53  2021-04-21 00:00:00
923 Mike    56  2021-04-23 00:00:00
925 Oliver  62  2021-04-25 00:00:00
927 Paul    65  2021-04-27 00:00:00
929 Robert  71  2021-04-29 00:00:00

如果我们将查询改为下面的形式,就可以使用索引了:

SELECT * FROM student WHERE create_time >= '2021-04-01' AND create_time < '2021-05-01';
  1. 在联合索引中未按照顺序使用:

我们使用下面的查询语句查询年龄大于18岁且名字为Alex的学生记录:

SELECT * FROM student WHERE name = 'Alex' AND age > 18;

可以看到,虽然(name, age)上有一个联合索引,但是这个索引无法被使用,因为查询时未按照索引中列的顺序使用,如果我们将查询改为下面的形式,就可以使用索引了:

SELECT * FROM student WHERE age > 18 AND name = 'Alex';

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL导致索引失效的几种情况 - Python技术站

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

相关文章

  • DBMS中的位图索引

    位图索引是一种特殊类型的索引,用于在DBMS中加速条件查询。具体的实现方法是,对于表中某个特定的列,将其所有可能值所对应的行编号(或者行的位置)用二进制的0和1表示出来,形成一个位图vector。这样,在查询时,由于查询条件本质上也是一个值,因此只需要在该值所对应的位图vector中找到所有1的位置即可找到满足条件的行。 下面我们来详细讲解位图索引的实现步骤…

    database 2023年3月27日
    00
  • 详解linux pwm驱动编写

    关于详解Linux PWM驱动编写的攻略,我们可以分为以下几个步骤进行。 步骤一:准备工作 在编写PWM驱动程序前,我们需要先了解一下硬件平台的PWM控制器的注册方式,这样才能在Linux驱动中使用。在实际工程中,可以通过读取设备文件 /sys/kernel/debug/pwm,通过查看 pwmchipN 的值来确定硬件平台的PWM控制器的数量和编号。 读取…

    database 2023年5月22日
    00
  • MySQL需要关注的参数及状态变量解读

    让我来为您提供MySQL需要关注的参数及状态变量解读的攻略。 MySQL参数 MySQL参数主要用于影响MySQL服务器运行的一系列设置,常见的MySQL参数如下: buffer_pool_size buffer_pool_size是MySQL中一个重要的参数,该参数用于设置InnoDB存储引擎在内存中的缓存池大小。对于大部分应用而言,适当调整buffer_…

    database 2023年5月22日
    00
  • 深入讲解MongoDB的慢日志查询(profile)

    下面我将详细讲解关于MongoDB的慢日志查询(即profile)的完整攻略: MongoDB的慢日志查询(profile) 什么是慢日志查询(profile) MongoDB的慢日志查询是指将MongoDB数据库中执行时间较长的操作记录下来,并保存到慢查询日志中。MongoDB通过慢日志查询,可以掌握响应时间较慢的查询,以及可能需要优化的操作。慢日志查询功…

    database 2023年5月21日
    00
  • C#数据库操作类AccessHelper实例

    这里是关于“C#数据库操作类AccessHelper实例”的完整攻略。 什么是AccessHelper AccessHelper是一个针对Microsoft Access数据库的C#操作类。通过使用AccessHelper类,您可以方便地操作Access数据库。AccessHelper提供了创建、读取、更新、删除操作,并且使用方便、集成度高。 使用Acces…

    database 2023年5月21日
    00
  • 如何在Python中插入MongoDB数据库中的数据?

    以下是在Python中插入MongoDB数据库中的数据的完整使用攻略。 使用MongoDB数据库的前提条件 在使用Python连接MongoDB数据库之前,确保已经安装了MongoDB数据库,并已经创建使用数据库和集合,同时需要安装Python的驱动,例如pymongo。 步骤1:导入模块 在Python中使用pymongo模块连接MongoDB数据库。以下…

    python 2023年5月12日
    00
  • 一文深入解析JDBC超时机制

    当我们使用JDBC进行数据库操作时,有时候需要进行超时操作,即当数据库操作时间超过一定时间时,自动终止该操作。这就需要使用JDBC超时机制来实现。 JDBC超时机制的原理 JDBC超时机制是通过使用JDBC的Statement或者PreparedStatement的setQueryTimeout方法来实现的。当我们调用该方法并设置超时时间时,JDBC就会自动…

    database 2023年5月22日
    00
  • Java中的反射机制详解

    Java中的反射机制详解 Java中的反射机制是指程序在运行时可以获取自身的信息并进行操作的能力。利用反射机制,我们能够动态获取类的信息,动态创建对象,调用方法等。 反射的基础概念 反射机制是基于Java语言的特性来进行实现的。Java程序的运行需要经过三个步骤: 编写源代码 编译成.class字节码文件 在JVM上运行.class字节码文件 反射机制是在第…

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