当前位置: 首页 > article >正文

SQL实战之索引优化(单表、双表、三表、索引失效)

文章目录

  • 单表优化
  • 双表优化
  • 三表优化
  • 结论
  • 索引失效

单表优化

总体原则:建立索引并合理使用,避免索引失效

案例说明:查询category_ id 为1且comments大于1的情况下,views最多的article_ id:

传统方案:
explain select id, author_ id from article where category_ id = 1 AND comments > 1 order by views desc limit 1;
在这里插入图片描述

SQL性能分析01:出现全表扫描all、无索引null、以及文件外排序Using filesort,导致性能最差

优化一:新建复合索引(直接3个字段)

create index idx_ article_ CCV on article(category_ id, comments, views);

explain select id, author_ id from article where category_ id = 1 AND comments > 1 order by views desc limit 1;

在这里插入图片描述

SQL性能分析02: 解决了全表扫描all、无索引的问题,但是仍然存在Using filesort

原因:comments > 1导致views索引失效,出现文件内排序问题,若comments =1索引不会失效 ,哈哈

优化二:新建索引(优化为两个字段)

create index idx_ article_ CV on article (category_ id, views);
explain select id, author_ id from article where category_ id = 1 AND comments > 1 order by views desc limit 1;

在这里插入图片描述

总结:合理设置索引,解决了全表扫描all、无索引、Using filesorting内排序的问题

双表优化

案例说明:查看left join的查询性能以及如何加索引?

传统方案:
explain select * from class LEFT JOIN book ON class.card = book.card;

在这里插入图片描述

SQL性能分析01: type查询种类两个都是all全表扫描,性能较差,问题是现在给哪个表加索引,左表calss?右表book?

优化一:左表class主键加索引
create index Y class(card)
explain select * from class LEFT JOIN book ON class.card = book.card;

在这里插入图片描述

优化二:右表book主键加索引
create index Y class(card)
explain select * from class LEFT JOIN book ON class.card = book.card;

在这里插入图片描述

结论:

  1. 显然给右表加索引的性能type=ref比左表性能type=range好
  2. 左连接A left join B给右表B主键加索引性能更高(因为左连接,左表一定都有,性能取决于右表,所以给右表加索引)
  3. 右连接A right join B给左表A主键加索引性能更高

三表优化

需求:三表连接以及如何加索引
传统方案:
explain SELECT FROM c1ass LEFT JOIN book ON c1ass .card=book .card
LEFT JOIN phone ON book.card=phone .card ;

在这里插入图片描述

优化一:后两个表phone、book主键加索引
create index Y phone(card)
create index X book(card)
explain SELECT FROM c1ass LEFT JOIN book ON c1ass .card=book .card
LEFT JOIN phone ON book.card=phone .card ;

在这里插入图片描述

后2行的type都是ref且总rows优化很好效果不错。因此索引最好设置在需要经常查询的字段中

结论

1、永远用小结果集驱动大结果集
2、尽可能减少Join语句中的NestedLoop的循环总次数
3、优先优化NestedLoop内层循环次数
4、保证Join语句中被驱动表上Join条件字段已经被索引
5、当无法保证被驱动表的Join条件字段被索引且内存资源充足的前提下,不要太吝惜JoinBuffer的设置;

索引失效

1、全值匹配我最爱
2、最佳左前缀法则:指的是查询从索引的最左前列开始且不跳过索引中的列。(带头大哥不能死,中间兄弟不能断)
3、不在索引列上做任何操作(计算、函数、自动or手动类型转换),会导致索引失效而转向全表扫描type=all(索引列上少计算)
4、不能使用索引中范围条件右边的列(范围之后全失效)
5、尽量使用覆盖索引(索引列和查询列一致),(尽量减少使用select *)
6、like以通配符开头mysql索引失效会变成全表扫描的操作 (like %加右边)
7、字符串varchar不加单引号索引失效(字符串里留引号)
8、is null,is not null, or, != 无法使用索引会导致全表扫描SQL索引优化口诀全值匹配我最爱,最左前缀要遵守;带头大哥不能死,中间兄弟不能断;索引列上少计算,范围之后全失效;LIKE百分写最右,覆盖索引不写星;不等空值还有or,索引失效要少用;VAR引号不可丢,SQL高级也不难!
http://www.lryc.cn/news/2387848.html

相关文章:

  • [7-1] ADC模数转换器 江协科技学习笔记(14个知识点)
  • SSM整合:Spring+SpringMVC+MyBatis完美融合实战指南
  • Spring Boot分页查询进阶:整合Spring Data REST实现高效数据导航
  • 阿里云 Serverless 助力海牙湾构建弹性、高效、智能的 AI 数字化平台
  • 升级node@22后运行npm install报错 distutils not found
  • 一个开源的多播放源自动采集在线影视网站
  • 【PhysUnits】10 减一操作(sub1.rs)
  • 深度检测与动态透明度控制 - 基于Babylon.js的遮挡检测实现解析
  • Linux下使用socat将TCP服务转为虚拟串口设备
  • docker push 报错 denied: requested access to the resource is denied
  • epub→pdf | which 在线转换??好用!!
  • PBX、IP PBX、FXO 、FXS 、VOIP、SIP 的概念解析以及关系
  • MySQL数据高效集成到金蝶云星空的技术分享
  • git 命令之-git cherry-pick
  • 如何在STM32CubeMX下为STM32工程配置调试打印功能
  • Linux系统 - 基本概念
  • kerberos在无痕浏览器 获取用户信息失败 如何判断是否无痕浏览器
  • 在h5端实现录音发送功能(兼容内嵌微信小程序) recorder-core
  • PDF电子发票数据提取至Excel
  • 【身份证识别表格】把大量手机拍摄的身份证信息转换成EXCEL表格的数据,拍的身份证照片转成excel表格保存,基于WPF和腾讯OCR的实现方案
  • FPGA高速接口 mipi lvds cameralink hdml 千兆网 sdi
  • Linux路径解析指南:逻辑路径 vs 实际路径详解
  • Azure 公有云基础架构与核心服务:从基础到实践指南
  • 【运维_日常报错解决方案_docker系列】一、docker系统不起来
  • C# 数组与字符串:全面解析与应用实践
  • 前端vue中使用signalr
  • Stable Diffusion底模对应的VAE推荐
  • centos7.5安装kubernetes1.25.0
  • ‌AT2659S射频前端芯片技术解析:L1频段低噪声高增益GNSS信号放大
  • ROS2学习(15)------ROS2 TF2 机器人坐标系管理器