首页 > 数据库 >MYSQL索引失效场景及其原理

MYSQL索引失效场景及其原理

时间:2023-04-19 12:12:21浏览次数:40  
标签:MYSQL 查询 索引 MySQL 失效 WHERE SELECT

MySQL索引失效是指查询时不能有效利用索引,从而导致查询性能下降的现象。以下是一些常见的MySQL索引失效场景及原理:

使用函数或表达式:在WHERE子句中对索引列使用函数或表达式会导致索引失效。因为MySQL无法预先计算表达式的结果,所以无法使用索引进行查找。
例:SELECT * FROM users WHERE YEAR(birthday) = 1990;
原理:此查询中,YEAR函数作用在索引列birthday上,导致索引失效。

隐式类型转换:如果查询条件与索引列类型不匹配,MySQL会进行隐式类型转换,可能导致索引失效。
例:SELECT * FROM users WHERE age = '30';
原理:此查询中,假设age字段是整数类型,而查询条件使用了字符串类型,导致类型不匹配。MySQL会尝试将age字段转换为字符串,从而导致索引失效。

不等于(!= 或 <>)操作符:使用不等于操作符会导致索引失效,因为MySQL无法利用索引进行范围查找。
例:SELECT * FROM users WHERE age <> 30;
原理:此查询中,由于使用了不等于操作符,MySQL无法利用索引进行查找,因此索引失效。

范围查询的多列索引:对于多列联合索引,如果查询条件中包含范围查询(如BETWEEN、>、< 等),那么在范围查询之后的索引列将失效。
例:SELECT * FROM orders WHERE user_id = 1 AND order_date > '2022-01-01';
原理:假设存在一个多列联合索引(user_id, order_date),此查询中对order_date进行了范围查询,使得索引列order_date之后的索引失效。

OR 连接的条件:使用OR连接的条件可能导致索引失效,尤其是在OR条件中涉及多个索引列时。
例:SELECT * FROM users WHERE age = 30 OR name = 'Alice';
原理:此查询中,由于使用了OR连接,MySQL可能无法同时利用age和name两个索引列进行查找,导致索引失效。

LIKE 查询:如果在LIKE查询中,通配符(%或_)在字符串的开头,将导致索引失效。
例:SELECT * FROM users WHERE name LIKE '%Alice%';
原理:此查询中,由于通配符在字符串的开头,MySQL无法使用索引进行查找,因此索引失效。

需要注意的是,实际查询优化器会根据数据量、数据分布等因素决定是否使用索引。

标签:MYSQL,查询,索引,MySQL,失效,WHERE,SELECT
From: https://www.cnblogs.com/itqczzz/p/17332894.html

相关文章

  • MySQL事务实现原理
    事务是什么?首先思考一个问题,事务是什么?以下是事务的相关解释MySQL中的事务是一种用于确保数据库操作的完整性和一致性的机制。事务处理具有以下四个基本特性,通常被称为ACID特性:原子性(Atomicity):原子性是指事务中的所有操作要么全部完成,要么全部不完成。事务中的操作不可分割,如果......
  • MySQL InnoDB存储引擎选择B+树作为索引数据结构的原因
    MySQLInnoDB存储引擎选择B+树作为索引数据结构的原因在于其特点与性能。B+树相比红黑树和B树,更适用于关系型数据库的特点,具体体现在以下几个方面:磁盘I/O效率:数据库的数据通常存储在磁盘上,磁盘I/O操作相对较慢。B+树的一个重要特点是它能减少磁盘I/O次数。B+树是一种多路平衡查......
  • MySQL InnoDB存储引擎选择B+树作为索引数据结构的原因
    MySQLInnoDB存储引擎选择B+树作为索引数据结构的原因在于其特点与性能。B+树相比红黑树和B树,更适用于关系型数据库的特点,具体体现在以下几个方面:磁盘I/O效率:数据库的数据通常存储在磁盘上,磁盘I/O操作相对较慢。B+树的一个重要特点是它能减少磁盘I/O次数。B+树是一种多路平衡查......
  • Mysql-InnoDB深入学习
    MySql——InnoDB学习笔记转载请声明!!!切勿剽窃他人成果。本文如有错误欢迎指正,感激不尽。参考资料见最后一章所有例子均是本人亲自上机后,将代码或结果复制回来的。请勿盗图一、Mysql体系结构和存储引擎1.1MySQL体系结构我们先明白两个概念,数据库和实例。数据库是物理上的操......
  • 云时代,MySQL到ClickHouse数据同步产品对比推荐
    ClickHouse在执行分析查询时的速度优势很好的弥补了MySQL的不足,但是对于很多开发者和DBA来说,如何将MySQL稳定、高效、简单的同步到ClickHouse却很困难。本文对比了NineData、MaterializeMySQL(ClickHouse自带)、Bifrost三款产品,看看他们在同步时的差异。对比结果概述整体上......
  • mysql中对于 GROUP_CONCAT 函数的长度限制处理
    今天才知,原来GROUP_CONCAT函数返回的长度默认是有限制的:mysql>SHOWVARIABLESLIKE"group_concat_max_len";可见,默认是最长不超过1024。 修改mysql的配置参数增加限制:vi/etc/my.cnf[mysqld]group_concat_max_len=1024000 注意,有些文章里说设置成-1也可以,意......
  • mysql表加锁与解锁
    一、加锁表名:test1、加读锁#读锁,锁定之后,无论是当前线程还是其他线程均只能读操作,写操作全部被堵塞,备份时可以用,避免在备份过程中,表被更新LOCKTABLEStestREAD; 2、加写锁#写锁,锁定之后,只有当前线程可以进行读操作和写操作,其他线程读操作和写操作均被堵塞.LOCKTABL......
  • MySQL 时间类型 date、datetime 和 timestamp 的用法与区别
    时间范围datetime和timestamp区别时间范围不一样,TIMESTAMP要小很多,且最大范围为2038-01-1903:14:07.999999,到期也不远了。datetime与时区无关、timestamp与时区有关。对于timestamp,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转......
  • mysql增删改查
    1、增insertintotable_name()value();insertintotable_name()values(),(),();insertintotable_namevalue();增加数据,通过关键字insert进行如果是在一行中插入部分字段数据,必须在value之前声明插入字段,而value后的值按声明字段顺序排列。如果插入全部字段,可......
  • mysql高级查询
    1、union联合查询,使用关键字union,其前后为查询字段数相等的select语句。查询结果是先输出前表的行,再输出后表的行。union后可以使用关键字all或者distinct,分别表示不去重和去重。去重指的是将重复的行只保留最开始的一行,判断依据是前后按序对应的查询字段,只区分字面量,而不关心数......