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

yizhihongxing

关于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日

相关文章

  • 解决Navicat for MySQL 连接 MySQL 报2005错误的问题

    解决 Navicat for MySQL 连接 MySQL 报2005错误的问题 问题描述 在使用 Navicat for MySQL 连接 MySQL 数据库时,可能会遇到 “2005 – Unknown MySQL server host” 错误,错误信息如下: 2005 – Unknown MySQL server host ‘hostname’ (0…

    MySQL 2023年5月18日
    00
  • 详解MySQL 联合查询优化机制

    详解MySQL 联合查询优化机制 MySQL是一款性能优良的关系型数据库,除了基础的查询语句外,MySQL还支持多种高级查询语句,如联合查询。本文将详细讲解MySQL联合查询的优化机制。 联合查询的基础语法 联合查询可以将多个SELECT语句的结果集合并为一个结果集输出,语法如下: SELECT column1, column2, ……, colum…

    MySQL 2023年5月19日
    00
  • Windows下MySQL 5.7无法启动的解决方法

    Windows下MySQL 5.7无法启动的解决方法 问题描述 在Windows操作系统上,当尝试启动MySQL 5.7 时,可能会遇到无法启动的情况。这个问题可能由多种原因引起,如端口占用、配置文件错误、权限问题等。本篇攻略将分别介绍解决这些问题的方法,以帮助读者快速解决问题,并顺利启动MySQL 5.7。 解决方法一:检查端口占用以及防火墙设置 打开cm…

    MySQL 2023年5月18日
    00
  • MySQL中如何优化order by语句

    当查询语句中包含了ORDER BY时,MySQL在查询结果之前会先做一个排序操作,这个操作需要消耗大量的资源,如果排序操作的效率不高,则整个查询的效率也会受到影响。因此,对于MySQL中的ORDER BY语句,进行优化是非常重要的。 以下是优化MySQL中ORDER BY语句的攻略: 1. 索引优化 ORDER BY语句可以使用索引进行优化,如果查询的字段已…

    MySQL 2023年5月19日
    00
  • 修改Innodb的数据页大小以优化MySQL的方法

    修改Innodb的数据页大小可以通过优化MySQL的性能。以下是修改Innodb的数据页大小的完整攻略: 步骤一:备份MySQL数据库 在进行任何修改之前,先备份MySQL数据库并确保保存了原始配置文件的副本。 步骤二:确定Innodb缓冲池大小 首先需要确定Innodb缓冲池大小。您可以通过运行以下命令来确定当前的缓冲池大小: SHOW VARIABLES…

    MySQL 2023年5月19日
    00
  • MySQL查询性能优化武器之链路追踪

    MySQL查询性能优化是关系型数据库优化的核心之一,而链路追踪则是一种用于查找系统性能瓶颈的工具。本文将介绍如何使用链路追踪来分析MySQL查询性能问题。本文将分为以下几个部分: 链路追踪概述 MySQL性能问题分析 使用Zipkin进行链路追踪 示例说明 1. 链路追踪概述 链路追踪是一种用于查找系统性能瓶颈的工具,可以对分布式系统中的各个组件进行监控和追…

    MySQL 2023年5月19日
    00
  • 解决Navicat Premium 连接 MySQL 8.0 报错”1251″的问题分析

    以下是解决Navicat Premium 连接 MySQL 8.0 报错”1251″的问题分析的完整攻略。 问题分析 当我们使用Navicat Premium连接MySQL 8.0时,可能会出现如下报错信息: 1251 – Client does not support authentication protocol requested by server.…

    MySQL 2023年5月18日
    00
  • mysql出现提示错误10061的解决方法

    下面是关于“mysql出现提示错误10061的解决方法”的完整攻略。 问题描述 当你在使用MySQL时,有时会遇到错误代码10061,描述为“无法连接,目标计算机拒绝连接。”这个错误可能会出现在多种情况下,比如你正在尝试远程连接MySQL服务器或者在本地使用MySQL时,但无论何种情况,都需要及时解决这个问题。 解决方法 要解决这个问题,你可以尝试以下几个方…

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