首页 > 数据库 >Mysql:索引失效的常见场景

Mysql:索引失效的常见场景

时间:2023-01-16 11:11:41浏览次数:49  
标签:index name age 索引 Mysql 失效 where select

索引失效的常见场景

不符合最佳左前缀原则

比如说现在创建一个联合索引:index_union(name,age),然后你的select语句是这样的

select * from user where age = 18

此情况下并不会触发index_union,因为where没使用上name

查询语句中存在函数,计算,数据类型转换

比如说现在创建两个普通索引:index_name(name)和index_age(age),然后你的select语句是这样的

select * from user where left(name,1) = '李'
select * from user where age + 1 = 80

此情况索引会失效

where使用了联合索引全部字段,但实际只用了一部分

比如说现在创建一个联合索引:index_union(name,age,sex),然后你的select语句是这样的

select * from user where name = 'zhangsan' and age > 50 and sex = 1

此select会用到index_union,但只用到name,age和sex不会用到,因为age是范围查询,优化器就不考虑使用age了

建议:尽量把一些频繁范围查询的字段,放在联合索引的靠后位置,比如说时间字段

!= 导致索引失效

比如说现在创建个普通索引:index_age(age),然后你的select语句是这样的:

select * from user where age != 8

此情况不会触发index_age

is null 触发索引,is not null不触发索引

比如说现在创建个普通索引:index_age(age),然后你的select语句是这样的:

select * from user where age is null //能触发索引
select * from user where age is not null //不能触发索引

建议:如果实际开发中真遇到查询 is not null 又要求查询得快,可以考虑将此字段设计成非空。比如说int类型,用0表示空,varchar用‘’表示空。这样就字段中全是有值的,不需要考虑is not null了

like以通配符%开头的

比如说现在创建个普通索引:index_name(name),然后你的select语句是这样的:

select * from user where name like '李%' //能触发索引
select * from user where name like '%李%' //触发不了索引

OR关联的where条件中存在未索引的字段

比如说现在创建个普通索引:index_name(name),然后你的select语句是这样的:

select * from user where name = 'zhangsan' OR age > 18

此情况不会触发index_name,因为优化器觉得name走索引后,age还要走全表,还不如都直接走全表。

标签:index,name,age,索引,Mysql,失效,where,select
From: https://www.cnblogs.com/ibcdwx/p/17054945.html

相关文章

  • mysql mgr demo
    dockercompose配置services:db:container_name:mgr-db-0image:mysql:8.0restart:alwaysenvironment:MYSQL_ROOT_PASSWORD:'123456'......
  • 倒排索引实现方式
    definverted_index_test():df1=pd.DataFrame({"A":['aca','bd'],"B":['ada','ca']})print(df1)print("A分割操作")df2=df1['A'].str.spli......
  • Mysql:explain
    explainmysql提供了一种方式,目的是为了让我们知道sql的执行顺序、索引使用情况、执行效率的情况tabletable是展示执行计划过程中,会使用到的表。执行explain出现的每条......
  • 【学习日志】MySQL分表与索引的关系
    什么情况下需要分表呢?分表又能解决什么问题呢?一般情况下分表的直接原因是数据量太大了,比如一张表一共只有1w条数据,确实没必要分表。为什么数据量大了就需要分表呢?首先得看......
  • MySQL判断数据是不是存在的方法
        在mysql中,可以利用count()函数判断数据是否存在,该函数的作用就是用来统计表中记录数据,语法为“selectCOUNT(字段值)as字段名from表名where字段条件;”,......
  • mysql--时间
    mysql时间相关类型:date//年月日2023-1-15time//时分秒10:10:10datetime//年月日时分秒2023-1-1510:10:10timestamp//时间戳,插入,更新时自动写入当前时间注......
  • 解决mysql输入密码无法登录的问题
    ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:YES)当我输入root登录输入密码就会出现这种错误,不输入密码就可以登录,不输入密码里面......
  • 开启wamp依旧使用已下载的mysql
    1.打开D:\Environment\wamp64\bin\mysql\mysql8.0.31,修改my.ini添加本机mysql密码,并且将3个port=3306改为port=33162.打开D:\Environment\wamp64\apps\phpmyadmin5.2.0,......
  • Windows 安装 MySQL
    转:Win10安装MySQL教程下载安装包https://dev.mysql.com/downloads/installer/安装选Custom模式:从可安装的产品(Products)中选择MySQLServer:点击绿色按钮,将......
  • MySQL 5.X升级到8.X
    1.备份数据打开SQLyog,备份数据库为sql文件,以防升级过程中造成数据丢失。2.卸载MySQL5.X2.1停止服务按win键输入cmd,右键选择以管理员身份打开,输入netstopmysql停......