第七章 创建⾼性能的索引

简介: 第七章 创建⾼性能的索引

索引基础

索引可以包含⼀列或多列,顺序也⼗分重要,因为MySQL只能使⽤索引的最左前缀列。

索引的类型


BTree索引,⼀般使⽤B-tree索引,MySQL使⽤B+Tree,

B-Tree所有值都是按顺序排序的,B-tree是按照索引列中的数据⼤⼩顺序存储的,所以很适合按照范围来查询。


⾃适应hash索引,具有hash的优势,由MySQL⾃动⽣成


全值匹配

匹配索引的所有列.

匹配最左前缀

只使⽤索引的第⼀列。

匹配列前缀

只匹配某⼀列的开头部分。

匹配范围值

关于B-tree的限制

不是从最左列索引开始查找,不能使⽤索引。

不能跳过索引的列

如果某索引列中有范围查找,那么右边的索引列都不能

使⽤去优化查找


全⽂索引

是⼀种特殊的索引类型,适⽤于match against,⽽不是普通的where条件操作。

使⽤索引的优点

加速查找的过程,减少扫描⾏数,避免排序和临时表,将随机io转换成顺序io。

⾼性能索引的策略

前缀索引和索引的选择性

保证⼀定选择性的前缀索引,但是不能太⻓。

创建前缀索引 :

多列索引

最常⻅的问题就是为每⼀列都创建单独的索引。

使⽤or或者union时,优化器会使⽤多个索引的联合,索引合并说明了索引建⽴得很糟糕,需要耗费⼤量cpu资源,并且优化器会忽略这些查询成本,有时还不如全表扫描。

alter table t1 add key (

city(7))explain看到索引合并,检查语法和表结构。或者关闭索引功能,使⽤ignore index语法忽略索引。

选择合适的索引列顺序

经典法则:将选择性最⾼的索引放在符合索引的最前⾯。(不是全部都适合)

聚簇索引

聚簇表示数据⾏和索引的键值紧凑的存储在⼀起。⼀般根据主键聚簇数据,没有主键innodb选择⼀个⾮空的键,如果没有⾮空键就创建⼀个rowid,但是会导致锁竞争。

聚簇索引的优点:减少io次数,数据访问更快,更新聚簇索引的代价很⾼,会将⾏移动到新的位置。

聚簇索引可能导致全表扫⾯变慢,尤其是⻚⽐较稀疏的情况下。

⼆级索引需要两次查找。

使⽤⾃增主键做聚簇索引主键较好,使⽤uuid,由于uuid是随机的会导致插⼊时性能差。

使⽤uuid的⼀些缺点:

a. 频繁做⻚分裂

b. 造成⼤量随机io

c. 频繁⻚分裂导致⻚间隙,内存碎⽚。

最好插⼊后做⼀次optimize table 调整⼀下⻚。

什么时候按主键顺序插⼊性能较差?

在并发插⼊的情况下,可能间隙锁的竞争⼤。

覆盖索引

索引的叶⼦节点已经包含要查询的数据,就称为索引覆盖。

只有当索引的顺序和order by的顺序完全⼀致才能使⽤索引对结果排序。即使不满⾜索引的最左前缀要求,如果指定了最左的索引列为常数,也可以使⽤索引进⾏排序。

冗余和重复索引

删除冗余的索引,使⽤performance和sys数据库,查看

sys.schema_unused_indexs查看未使⽤的索引。

维护索引和表

由于⼀些硬件错误导致索引出现问题,可以使⽤check table来检查表的问题。

相关文章
|
4月前
|
监控 容灾 测试技术
第三方API的稳定性如何保障?
第三方API的稳定性对电商至关重要,直接影响业务连续性和用户体验。为确保稳定,可采取以下措施:选择可靠提供商、评估技术架构高可用性、实现限流重试机制、实时监控预警、充分测试、优化网络连接、使用API网关、保持与提供商沟通、制定应急预案及定期评估改进。这些方法能有效提升API稳定性,保障业务高效运行和用户满意度。
131 0
|
9月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
207 7
|
11月前
|
敏捷开发 监控 数据可视化
2024年敏捷项目管理工具使用排行榜:哪些工具适合大型团队?
随着敏捷方法的普及,2024年的敏捷项目管理工具市场更加多样化,从团队协作到任务追踪,功能日益丰富。本文将评测六款热门工具:板栗看板、Wrike、Smartsheet、TeamGantt、Targetprocess和Airtable,分析其功能亮点、适用行业及优缺点,助力企业选择最适合的工具。
2024年敏捷项目管理工具使用排行榜:哪些工具适合大型团队?
|
缓存 NoSQL 应用服务中间件
Redis实战篇
Redis实战篇
|
NoSQL Ubuntu MongoDB
在Ubuntu 16.04上安装和保护MongoDB的方法
在Ubuntu 16.04上安装和保护MongoDB的方法
176 1
|
测试技术 Nacos Docker
xxl任务绑定一台服务器的两个项目
项目需在测试和生产环境自动注册到xxl服务。之前测试环境未注册,且手动注册。解决方案:修改xxl.nacos配置,设置xxl.job.executor.ip为特定IP,避免自动注册错误的IP。因同一机器上运行两个项目,需分配不同端口,如测试环境设为9997,并在docker运行命令中映射该端口。最后在阿里云开放9997端口并重启服务,实现自动注册。
192 1
|
存储 数据采集 算法
22年美赛c题-交易策略
22年美赛c题-交易策略
408 0
|
机器学习/深度学习 自然语言处理 搜索推荐
大模型时代了,智能客服就不能智能点?
大模型时代了,智能客服就不能智能点?
205 0
|
Python
Python中如何定义函数 以及实参和形参的区别
Python中如何定义函数 以及实参和形参的区别
380 1
|
小程序 JavaScript 前端开发
【每周一个小技巧】支付宝小程序跳转生活号的几种方式
【每周一个小技巧】支付宝小程序跳转生活号的几种方式
593 8