MySQL(3)索引实践一

2023-09-17 20:59:18

一、索引下推:
对于辅助的联合索引(name,age),正常情况按照最左前缀原则,SELECT * FROM user WHERE name like 'xiao%'
AND age = 22  这种情况只会走name字段索引,因为根据name字段过滤完,得到的索引行里的age是无序的,无法很好的利用索引。
在MySQL5.6之前的版本,这个查询只能在联合索引里匹配到名字是 'xiao' 开头的索引,然后拿这些索引对应的主键逐个回表,到主键索
引上找出相应的记录,再比对age字段的值是否符合。
MySQL 5.6引入了索引下推优化,可以在索引遍历过程中,对索引中包含的所有字段先做判断,过滤掉不符合条件的记录之后再回表,可
以有效的减少回表次数。使用了索引下推优化后,上面那个查询在联合索引里匹配到名字是 'xiao' 开头的索引之后,同时还会在索引里过
滤age字段,拿着过滤完剩下的索引对应的主键id再回表查整行数据,这就是为什么like 'xiao%' 后面的age也会走索引的原因

二、filesort可以分为单路排序和双路排序
单路排序:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序;用trace工具可
以看到sort_mode信息里显示< sort_key, additional_fields >或者< sort_key,
packed_additional_fields >
双路排序(又叫回表排序模式):是首先根据相应的条件取出相应的排序字段和可以直接定位行
数据的行 ID,然后在 sort buffer 中进行排序,排序完后需要再次取回其它需要的字段;用trace工具
可以看到sort_mode信息里显示< sort_key, rowid >
MySQL 通过比较系统变量 max_length_for_sort_data(默认1024字节) 的大小和需要查询的字段总大小来
判断使用哪种排序模式。
如果 字段的总长度小于max_length_for_sort_data ,那么使用 单路排序模式;
如果 字段的总长度大于max_length_for_sort_data ,那么使用 双路排序模∙式。

三、注意
1、代码先行,索引后上
2、尽量建立联合索引,覆盖条件查询
3、不要在小基数上建立索引,比如性别
4、长字符串使用前缀索引,比如index(name(20)),这样mysql会先到索引树里根据name字段
的前20个字符去搜索,定位到前20个字符的前缀匹配的部分数据之后,再回到聚簇索引提取出来的
完成name字段值进行比对,但是order by name 不能走索引
5、where 与 order by 冲突优先where
6、mysql默认慢sql为10s,基于查询慢sql优化
7、where 多条件,范围查询放最后,如果有多个范围查询,可以修改第一个范围查询为in(),或者数据库做加一个字段范围标识,转换为等值查询,根据具体
情况去优化
8、select * from user force index(idx) 可以用force index 强制使用索引
9、in和or在表数据量比较大的情况下会走索引,在表记录不多的情况下会选择全表扫描
10、like 'kk%' 或者 >= 后面条件一般情况下都会走索引,使用了索引下推
11、查看order by 是否走索引,可以看 Extra字段,如果是 Using index是走了索引,如果是 Using filesort 使用了文件排序是没有走索引
12、查看sql执行情况的可以打开trace
set session optimizer_trace="enabled=on",end_markers_in_json=on; ‐‐开启trace
你的执行语句
SELECT * FROM information_schema.OPTIMIZER_TRACE;
生产环境关闭,会影响性能
set session optimizer_trace="enabled=off"; ‐‐关闭trace
 

更多推荐

【网络】计算机网络基础

Linux网络对网络的理解在网络传输中存在的问题:找到我们所需要传输的主机解决远距离数据传输丢失的问题怎么进行数据转发,路径选择的问题有问题,就有解决方案;我们把相同性质的问题放在一起,做出解决方案解决方案设计成为层状结构,层内部高内聚,层于层之间低耦合。层状结构有利于减少后期维护成本,只需要对某一层的错误进行处理在L

VRP基础及操作

通用路由平台ARP是华为公司数据通信产品的通用操作系统平台实现统一用户界面和管理界面实现控制平面功能实现网络接口层相关技术说明:交换技术:vlan,trunk,stp,vtp,三层交换,以太网通道路由技术:静态路由,默认路由,hsrp,rip,ospf,单臂路由,nat安全技术:ACL,防火墙,vpn各种技术的作用:v

Go 工具链详解(五):竞态条件检测神器 Race Detector

并发编程可以提高程序的性能和稳定性,但也带来了一些挑战,如竞态条件。竞态条件是指并发程序中的多个线程同时访问共享资源,导致程序行为不确定的问题。为了避免竞态条件的产生,需要使用同步机制(如互斥锁、条件变量等)来协调线程之间的访问。然而,在复杂的程序中,竞态条件可能难以察觉,因此Golang提供了竞态条件检测工具Race

Vue.js路由及Node.js的坏境配置--超详细

一,Vue路由1.1路由是什么路由是用来管理应用程序中不同页面之间导航的概念。VueRouter是Vue.js官方提供的路由管理器,它允许我们通过定义路由规则和视图组件来配置路由1.2路由给我们带来的好处有哪些?单页应用(SinglePageApplication):路由使得我们能够在单个页面中展示多个视图,而不必每次

超详细-Vivado配置Sublime+Sublime实现VHDL语法实时检查

目录一、前言二、准备工作三、Vivado配置Sublime3.1Vivado配置Sublime3.2环境变量添加3.3环境变量验证3.4Vivado设置3.5配置验证3.6解决Vivado配置失败问题四、Sublime配置4.1Sublime安装PackageControl4.2Sublime安装VHDL插件4.3语法

STM32单片机中国象棋TFT触摸屏小游戏

实践制作DIY-GC0167-中国象棋一、功能说明:基于STM32单片机设计-中国象棋二、功能介绍:硬件组成:STM32F103RCT6最小系统+2.8寸TFT电阻触摸屏+24C02存储器+1个按键(悔棋)游戏规则:1.有悔棋键,点击后悔棋一步。2.有绿色提示线,提示当前该哪一方走棋了。3.不按照游戏规则走棋时,比如让

LabVIEW开发气动悬浮系统教学平台

LabVIEW开发气动悬浮系统教学平台目前,通过使用可编程逻辑控制器,几乎可以实现任何工业生产过程的自动化。工业自动化可以提高流程效率,提高生产水平并减少损失。在此背景下,介绍了工业自动化教育系统的设计和实现以及气动悬浮过程中的控制应用。该自动化系统基于PLCS7-1500和LabVIEW中设计的人机界面,用于监测气动

游戏开发之路

最近即将大四,面临实习和就业的问题,学校只想尽快把我们推出去,却不管前方是刀山还是火海。如果没有梦想,去哪里都是流浪。如果怀有梦想,你是否迷茫?我不是985也不是211,我不想使用Unity或Unreal,明明什么都没有我却想做出惊艳的3A作品。但现在实现不了梦想没关系,十年后也许可以实现梦想,二十年后也许可以实现梦想

Ae 效果:CC Hair

模拟/CCHairSimulation/CCHairCCHair(CC毛发)可以在源图像上模拟生成毛发、绒线等,并可调整它们的长度、方向、重量等属性,从而创建出非常独特的效果。CCHair本质上是基于Alpha通道来生成毛发,无毛发处将变为透明。比如,对于文本等矢量图层,它会基于Alpha通道的轮廓来生成毛发。◆◆◆效

企业怎么优化固定资产管理

在优化固定资产管理的过程中,不仅要关注硬件设备和设施的维护,还要重视软件系统和数据管理。一些可能的方法:需要建立一套完整的资产管理系统。这个系统应该包括资产的采购、登记、使用、维修、报废等各个环节的管理流程。通过这个系统,可以实时了解每个资产的状态,及时发现并解决潜在的问题。应该对固定资产进行定期的盘点和维护。这不仅可

操作系统权限提升(二十六)之数据库提权-MySQL UDF提权

MySQLUDF提权MySQL介绍MySQL是最流行的开放源码SQL数据库管理系统,相对于Oracle,DB2等大型数据库系统,MySQL由于其开源性、易用性、稳定性等特点,受到个人使用者、中小型企业甚至一些大型企业的广泛欢迎,MySQL具有以下特点:1、MySQL是一种关联数据库管理系统,具有灵活性。2、MySQL软

热文推荐