首页 > 数据库 >sql语句性能进阶必须了解的知识点——索引失效分析

sql语句性能进阶必须了解的知识点——索引失效分析

时间:2023-11-02 15:05:20浏览次数:47  
标签:知识点 code 进阶 索引 user sql where order select

sql语句性能进阶必须了解的知识点——索引失效分析_字段

在前面的文章中讲解了sql语句的优化策略

https://blog.51cto.com/liwen629/8146651

sql语句的优化重点还有一处,那就是—— 索引!好多sql语句慢的本质原因就是设置的索引失效或者根本没有建立索引!今天我们就来总结一下那些无效的索引设置方式进而避免大家踩坑!看到这里有的同学会问:what?设置的索引还会失效?没错!接下来就让我们细细道来,文章非常有用,建议大家收藏。

不满足最左匹配原则

建立联合索引:idx_code_age_name。

该索引字段的顺序是:

code

age

name

以下会走索引

select * from user where code='101';

select * from user where code='101' and age=21

select * from user where code='101' and age=21 and name='Kevin';

select * from userwhere code = '101' and name='Kevin';

以下不会走索引

select * from user where age=21;

select * from user where name='Kevin';

select * from user where age=21 and name='Kevin';

使用了select *

如果select *语句中的查询列,都是索引列,那么这些列被称为覆盖索引。这种情况下,查询的相关字段都能走索引,索引查询效率相对来说更高一些;而使用select *查询所有列的数据,大概率会查询非索引列的数据,非索引列不会走索引,查询效率非常低。

索引列上有计算

例如 select * from user where id+1=2; 索引会失效

索引类用了函数

例如 select * from user where SUBSTR(height,1,2)=17;索引会失效

字段类型不同

字段类型不同索引会失效,例如设置code 为varchar,类型使用语句select * from user where code="101" 会走索引,如果我们不小心写成select * from user where code=101,则索引失效。因为code字段的类型是varchar,而传参的类型是int,两种类型不同导致索引失效。注意有一个例外就是int类型的参数,不管在查询时加没加引号,都能走索引。

like左边包括%

目前like查询主要有三种情况:

like '%a'(索引无效)

like 'a%'(索引有效)

like '%a%'(索引无效)

列对比

如果把两个单独建了索引的列,用来做列对比时索引会失效。例如: select * from user where id=height

使用or关键字

要么不用or要么将or的条件列都加索引(新版本mysql8以上,mysql5.6 or 索引无效)会采用索引合并的方式优化查询。

Not in 和not exists

主键字段中使用not in关键字查询数据范围,仍然可以走索引。而普通索引字段使用了not in关键字查询数据范围,索引会失效;

not exists时,索引也会失效。

order by 的坑

前提:已经建了联合索引:idx_code_age_name。

1.配合limit一起遵循最左匹配原则

explain select * from user order by code limit 100;

explain select * from user order by code,age limit 100;

explain select * from user order by code,age,name limit 100;

注意 order by不满足最左匹配原则,不会走索引。例如select * from user order by name limit 100

2.order by还能配合where一起遵循最左匹配原则。

例如:select * from user where code='101' order by age;

3.order by后面如果包含了联合索引的多个排序字段,只要它们的排序规律是相同的(要么同时升序,要么同时降序),也可以走索引。

注意:如果使用不同的排序规则不会走索引,例如select * from user order by code asc,age desc limit 100

具体sql如下:

explain select * from user order by code desc,age desc limit 100;

4.如果某个联合索引字段,在where和order by中都有也可以走索引

explain select * from user where code='101' order by code, name;

5.如果order by语句中没有加where或limit关键字,该sql语句将不会走索引。

6.对多个索引(注意:不是联合索引)进行order by不会走索引

我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更

标签:知识点,code,进阶,索引,user,sql,where,order,select
From: https://blog.51cto.com/liwen629/8146898

相关文章

  • 16、MySQL拆分与拼接行数据
    一、根据逗号拆分行数据:1、数据表:2、数据拆分:SELECTde.uuid,de.`name`,SUBSTRING_INDEX(SUBSTRING_INDEX(de.`code`,',',ht.help_topic_id+1),',',-1)ASnewCodeFROM`demo`deJOINmysql.help_topichtONht.help_topic_id&......
  • Java语言基础知识点梳理与总结
    Java语言基础知识点梳理与总结Java是一种广泛应用于软件开发的编程语言,具有丰富的特性和功能。在学习Java语言时,了解以下基础知识点对于建立坚实的编程基础非常重要。本博客将介绍Java语言中的标识符、运算符、流程控制、循环结构、分支结构、数组、方法、类与对象等主要知识点。......
  • python爬虫数据存进mysql数据库
    一、安装mysql和mysqlworkbench我已经在电脑上安装了最新的mysql8.2.0,配置好环境变量,在命令提示符中以管理员的身份初始化并成功启动mysql数据库。前期因为以前的mysql没有卸载干净,导致mysql一直无法启动服务。所以一定要保证以前的mysql卸载干净才能重新安装,以前没有安装过的......
  • 一文学习mysql基础知识
    1.常见的数据库产品    1)oracle   --甲骨文    2)DB2      --IBM    3)SQLsever--微软    4)MySql    --AB->SUN->甲骨文2.名词解释    字段   --表中的列    记录   --表中的行3.登录远程数据库    1)打开一个终端窗......
  • mysqld got signal 11
    【1】mysql实例启动故障5.7.21-》5.7.42数据库升级后,启动发现错误日志如下2023-08-10T23:05:53.463377+08:000[Warning]TIMESTAMPwithimplicitDEFAULTvalueisdeprecated.Pleaseuse--explicit_defaults_for_timestampserveroption(seedocumentationformore......
  • sqlserver与Oracle建立连接,查询oracle中的数据(navicat版)
    1,打开navicat选中sqlserver服务器点击其他找到链接服务器(不要选错数据库)2,点击新建链接服务器,如图选着其他数据源,按图填写,程序字符串根据自己情况修改(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.6)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SER......
  • SQL注入基础总结
    SQL注入基础总结目录SQL注入基础总结概述注入姿势普通查询注入报错注入盲注更新注入堆叠注入二次注入宽字节注入二次编码注入DNSLOG外带注入MySQL的读写利用前提读取文件写入文件常见绕过结尾注释符过滤"and、or"过滤字符串过滤空格过滤比较符号"=、<、>"过滤引号过滤逗号过滤......
  • sql server 行转列、列转行
    stuff()函数用于从源字符串中删除给定长度的字符序列,并从指定的起始索引插入给定的字符序列。STUFF(source_string,start,length,change_string) source_string:字符数据start:指定删除和插入的开始位置length:指定要删除的字符数change_string:替换start到......
  • java语言基础数组,方法,类相关知识点的梳理总结
     Java是一种强大的面向对象编程语言,具有丰富的语法和功能。以下是Java语言的一些基础知识点的总结:数组(Arrays):数组是一种用于存储相同数据类型元素的数据结构。声明数组:int[]numbers=newint[5];,这创建了一个包含5个整数的数组。访问数组元素:intfirstNumber=......
  • 解决Mysql删除数据后,ID自增不连续问题
    修复前除了部分数据,导致后续新增的数据,ID自增不连续 解决方案执行下方SQL语句即可修复此问题,mbs_order为需要修复的表名SET@i=0;UPDATE`mbs_order`SET`id`=(@i:=@i+1);ALTERTABLE`mbs_order`AUTO_INCREMENT=0; https://blog.csdn.net/WQGuang/articl......