2021-2-24索引的相关知识及慢查询优化方案

什么是索引?
索引是存储引擎中的一种数据结构,或者说数据的组织方式,又称之为键key,为数据建立索引就好比为书建目录,目的是为了缩小查询范围,提升查询速度

为何要用索引?
为了优化查询效率
ps:创建完索引后会降低增删改的效率(文件不是很大时,影响效果不会很强烈)不过好就好在一般数据的读写比例是10:1,所以适当的建一些索引还是很有必要的。

如何正确的看待索引?
开发人员最懂业务,任何一个程序都有吸引用户的亮点,亮点背后对应的是热数据,这一点开发人员是最清楚的,开发人员最了解热数据对应的数据库表字段有哪些,所以开发程序过程中就应该提前为相应字段加上索引,而不是等软件上线以后由DBA发现慢查询sql后再做处理,因为:
1、一个软件慢会影响用户体验,但是慢的原因有很多,你不能立刻确定是不是sql的问题所以等定位到sql问题可能已经过去很久了,问题已经被拖了很久

2、因为大多数DBA都是管理型DBA而非开发型,所以即便是DBA从日志文件中看到了慢查询SQL,也会因为其不懂业务而很难分析出慢的原因,最后这顶锅还是得扣在你开发的脑袋上,躲得过初一躲不过十五

b+树:
在二叉树、平衡二叉树、b树的基础上做了进一步优化
只有叶子结点放真正的数据,这意味着在等量数据的前提下,B+树的高度是二叉树、平衡二叉树、b树中最低的,而树的高度越低查询速度越快,查询步数越少
b+树的性质:
1、索引字段要尽量的小,
2、索引的最左匹配特性(B+树是按照从筛选条件左至右的顺序来搜索树的,若条件中第一个命令不在索引中,那么B+树就不知道下一个节点该去哪查)

2、B+树的叶子节点都是排好序的,这意味着在范围查询上,B+树比b树更快,快就快在一旦找到了一个树叶节点,就不需要再从树根查起了

索引分类:
1、hash索引:更适合等值查询,不是和范围查询(不支持多列联合索引的最左匹配规则 如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题)
2、B+树索引;(innodb默认支持的索引
聚集索引(以主键字段建好的树)/聚簇索引()-》以主键字段的值为key创建的索引(一张表只有一个)
叶子结点存放的是完整的真实数据和主键
辅助索引:针对非主键字段创建的索引(一张表可以有多个)叶子结点存放的是非主键字段和这个字段对应的主键索引

命中索引也未必会起到很好的提速效果:
1、对区分度高并且占用空间小的字段建立索引
2、针对范围查询命中了索引,如果范围很大,查询效率依旧很低,如何解决
(1)要么把范围缩小
(2)要么分段取值,一段一段的取最终把大范围给取完
(3)索引下推技术(默认开启)有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。(在MYSQL5.6之后的版本引入的技术)
(4)不要把查询字段放到函数或者参与运算

回表查询:通过辅助索引拿到主键值,然后再回到聚集索引从根再查一下
覆盖索引:不需要回表就能拿到你要的全部数据(最优方案,速度很快)

250W条记录的文件大小为167M(几百兆)
300W条记录的文件大小为240M(几百兆)

联合索引:
组合索引最左前缀
如果组合索引为:(name, email)
name and email - - 命中索引
name - - 命中索引
email - - 未命中索引
作用:
创建的是一组索引,但可以由多个键来命中,既节省了磁盘空间,有简化了创建索引的步骤,但必须带上左边的key
联合索引的第二个好处是在第一个键相同的情况下,已经对第二个键进行了排序处理,

慢查询的优化步骤:
0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
3.order by limit 形式的sql语句让排序的表优先查
4.了解业务方使用场景
5.加索引时参照建索引的几大原则
6.观察结果,不符合预期继续从0分析

查询优化器 一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。 在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案。这个成本最低的方案就是所谓的执行计划。 优化过程大致如下:
1、根据搜索条件,找出所有可能使用的索引
2、计算全表扫描的代价
3、计算使用不同索引执行查询的代价
4、对比各种执行方案的代价,找出成本最低的那一个

猜你喜欢

转载自blog.csdn.net/givenchy_yzl/article/details/114026259