关于Mysql5.7及8.0版本索引失效情况汇总

关于MySQL 5.7及8.0版本索引失效情况汇总

索引失效的概念

在MySQL中,查询的速度与所涉及的数据量成正比,当数据量变大时,查询效率会明显下降,影响系统的性能。为了提高查询的效率,需要通过创建索引来实现。索引是一种数据结构,能够快速定位数据所在的位置,类似于书籍的目录,可以快速找到需要的内容。

但是,当数据量不断增加时,索引的维护成本也会随之增加,这时就需要注意索引失效的问题。索引失效指的是在数据查询时,MySQL无法使用索引来加速查询,而只能通过全表扫描来查找数据,导致查询效率显著下降。

导致索引失效的原因

  1. 对索引字段进行运算或函数操作

索引中存储的是数据的拷贝,因此对索引字段进行运算或函数操作会导致MySQL无法使用索引,例如:

SELECT * FROM users WHERE YEAR(register_time) = 2021;

由于对register_time字段进行了函数操作,MySQL无法使用该字段的索引,只能通过全表扫描来查找符合条件的数据。

  1. 对字段进行类型转换

MySQL会根据数据类型进行索引的创建,如果查询时对该字段进行类型转换,MySQL就无法使用索引,例如:

SELECT * FROM users WHERE CONVERT(id, CHAR) = '123';

由于将id字段转换为CHAR类型,MySQL无法使用该字段的索引,只能通过全表扫描来查找符合条件的数据。

  1. LIKE查询时,通配符在开头或两侧

LIKE查询时,如果通配符在开头或两侧,MySQL无法使用索引,例如:

SELECT * FROM users WHERE name LIKE '%张%';

由于通配符在两侧,MySQL无法使用name字段的索引,只能通过全表扫描来查找符合条件的数据。

  1. 查询条件中使用了OR

使用OR时,MySQL无法使用多个索引,也无法对多个索引进行合并,只能通过全表扫描来查找符合条件的数据,例如:

SELECT * FROM users WHERE province = '广东' OR city = '深圳';

MySQL无法使用provincecity字段的索引,只能通过全表扫描来查找符合条件的数据。

  1. 查询条件中使用了NOT

使用NOT时,MySQL无法使用索引,只能通过全表扫描来查找符合条件的数据,例如:

SELECT * FROM users WHERE NOT province = '广东';

MySQL无法使用province字段的索引,只能通过全表扫描来查找符合条件的数据。

更多导致索引失效的原因可以参考:《MySQL 行为和优化》第五章

索引失效示例

以下是两个导致索引失效的示例:

示例一:对索引字段进行运算或函数操作

假设有一张用户表users,表结构如下:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `register_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `register_time` (`register_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

此时如果查询register_time为2021年的所有用户,使用以下语句:

SELECT * FROM users WHERE YEAR(register_time) = 2021;

MySQL无法使用register_time字段的索引,只能通过全表扫描来查找符合条件的数据。

为了解决这个问题,可以使用以下语句:

SELECT * FROM users WHERE register_time BETWEEN '2021-01-01 00:00:00' AND '2021-12-31 23:59:59';

这样就可以使用register_time字段的索引来加速查询。

示例二:LIKE查询时,通配符在两侧

假设有一张用户表users,表结构如下:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `register_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

此时如果查询username中包含的所有用户,使用以下语句:

SELECT * FROM users WHERE username LIKE '%张%';

MySQL无法使用username字段的索引,只能通过全表扫描来查找符合条件的数据。

为了解决这个问题,在设计表结构时,可以考虑将username字段使用全文索引来优化查询效率,使用以下语句创建全文索引:

CREATE FULLTEXT INDEX `username_fulltext` ON `users` (`username`);

然后使用以下语句来查询符合条件的数据:

SELECT * FROM users WHERE MATCH(username) AGAINST('张');

使用全文索引可以大幅提高查询效率。

总结

索引失效是MySQL中常见的问题,需要注意在查询时尽量避免上述导致索引失效的情况。如果无法避免,可以通过优化查询语句、重新设计表结构等方式来解决问题,从而提高查询效率,提升系统性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Mysql5.7及8.0版本索引失效情况汇总 - Python技术站

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

相关文章

  • mysql数据库mysql: [ERROR] unknown option ‘–skip-grant-tables’

    首先,这个错误是因为该命令中使用了未知选项”–skip-grant-tables”,导致MySQL无法识别该选项,所以需要进行相应的处理来避免这个错误。下面是解决方案的完整攻略: 问题描述 在使用MySQL时,执行命令”mysql –skip-grant-tables”,会出现如下错误信息: mysql: [ERROR] unknown option ‘…

    MySQL 2023年5月18日
    00
  • MySql 错误Incorrect string value for column

    当使用MySQL进行字符串插入时,可能会出现错误“Incorrect string value for column”。这种错误主要是出现在当插入的字符串值中包含一些不受欢迎的字符,而MySQL表示不支持这些字符时会出现。 为了解决这个问题,需要以下步骤: 1. 确认MySQL字符集设置 这个错误通常是由于MySQL字符集不支持插入的字符串值中的某些字符。所…

    MySQL 2023年5月18日
    00
  • [MySQL] 索引的使用、SQL语句优化策略

    目录 索引 什么是索引 索引的创建与删除 创建索引 删除索引 索引的使用 使用explain分析SQL语句 最佳左前缀 索引覆盖 避免对索引列进行额外运算 SQL语句优化 小表驱动大表 索引 什么是索引 索引是一种方便我们高效查找某一列或几列数据的一种数据结构,一般是 B+树或者 hash树。想象一下在一个表中有一列是我们经常需要用于作为查询条件的列,也就是…

    MySQL 2023年4月12日
    00
  • MySQL远程连接丢失问题解决方法(Lost connection to MySQL server)

    当我们在MySQL客户端或者程序中远程连接MySQL服务器时,常常会出现“Lost connection to MySQL server”或者“Server has gone away”的问题。这是因为在网络传输的过程中可能会发生一些错误或者超时,导致连接中断。下面我将为大家详细讲解MySQL远程连接丢失问题的解决方法。 原因分析 MySQL远程连接丢失可能…

    MySQL 2023年5月18日
    00
  • MySQL检查约束(CHECK)详解

    MySQL的检查约束是一种在表中设定规则的方法,以确保插入或更新数据时不违反约束条件。MySQL支持在列定义中使用检查约束。 检查约束可以用于以下情况: 确定列或列组合的值要满足哪些条件; 确保在插入或更新行时,列的值不违反设置的规则。 以下是一个示例表的创建,其中使用了检查约束来限制product_price列的值必须大于0: CREATE TABLE p…

    MySQL 2023年3月9日
    00
  • MySQL优化之缓存优化(续)

    MySQL优化之缓存优化(续) 在上篇文章中,我们简单介绍了MySQL缓存的概念和使用方法。在今天的文章中,我们将进一步探讨MySQL的缓存优化,以提高MySQL的性能和稳定性。 1. 缓存过期机制 缓存数据过期机制是指缓存中的数据在一定时间内没有被访问就自动过期并被清除的机制。默认情况下,MySQL的缓存过期时间是1天。但在实际应用中,我们需要根据业务需求…

    MySQL 2023年5月19日
    00
  • Mysql 数据库 基础代码

    — 创建数据库 CREATE DATABASE book; — 创建作者表 CREATE TABLE authors( Id int not NULL, — 作者编号 Fname VARCHAR(10), — 姓 Lname VARCHAR(12), — 名 Sex CHAR(2), Sage int ); — 创建图书表 CREATE tabl…

    MySQL 2023年4月13日
    00
  • Linux(CentOS7)安装与卸载MySQL8.0图文详解

    Mysql数据库的安装对于开发者来说,是我们必然会面对的问题,它的安装过程其实并不复杂,并且网络上的安装教程也非常多,但是对于新手来说,各种不同形式的安装教程,又给新手们带来了要选择哪种方式进行安装的难题,而且很多时候按照教程也没有能够安装成功,安装过程出现各种各样的错误。 下面记录了我在Linux(Centos 7)环境下安装Mysql的完整过程,实操记录…

    MySQL 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部