原标题:MySQL 数据库案例优化分享-爱可生

前言

在数据库表结构变更发布之前,我们会和开发沟通索引设计是否合理,发现部分开发同学对于索引设计还是有一些知识盲区。本文把常见的案例记录下来,做个分析,抛砖引玉。

区分度和过滤性

先看一段和开发同学日常 sql review 的对话:

编辑

上面的对话其实在工作中比较常见(同时也说明我们培训没有到位 T_T),这样的想法会导致开发忽略选择性比较低的字段,sql 的执行计划使用 using where 匹配更多的数据行,结果执行耗时比较,性能就不理想。

大部分开发会了解这样的《开发规范》:创建索引要选择区分度高的字段。他们会认为区分度低的字段不适合创建索引或者不适合添加到组合索引里面。但是这样的操作会导致很多慢查。举例来说:

select * from tab where a=1 and b=2;

场景 1

符合 a=1 的记录数有 10w 条记录 ,b=2 有 1000 条记录。

如果只是创建 idx_a(a),sql 请求通过索引 idx_a 访问 10w 条件记录,然后还要逐一匹配 10w 条记录中的 status,找到符合 b=2 的记录。这个动作会导致慢查。

如果创建组合索引 idx_ab(a,b),sql 请求通过索引 idx_ab 可以直接定位到 1000 条记录,无需额外的过滤。这样减少访问 9900 条记录的时间,提升查询速度。

场景 2

符合 a=1 的有 100 条记录,status=2 有 10 条记录。

其实场景 2 因为数据量比较少,直接访问 100 条记录和定位到 10 条记录的时间消耗相差不大,量变不足以引发质变,可以忽略了。

Tips:

1. 创建索引的目的是通过索引尽可能找到匹配 where 条件的行,减少不必要的回表,提高查询效率;

2. 需要辩证地看待区分度比较低的字段在组合索引中的作用。在组合索引的情况下,我们不能只是单纯地看字段的区分度,而是要看符合条件的记录数是多少。符合条件的记录越少,性能越好。

索引的有序性

在优化业务 sql 的过程中,经常发现开发将 order by 的字段添加到组合索引里面,但是依然有 file sort 产生,导致慢查。这是为什么呢?

索引本身是有序的,之所以产生 file sort 说明组合索引中存在字段在索引中存储的顺序和order by 字段的顺序不一致,不是严格正相关导致 MySQL 根据结果重新排序。

order by 语句利用索引的有序性是有比较高要求的,组合索引中 order by 之前的字段必须是等值查询,不能是 in、between、 等范围查询,explain 的 type 是 range 的 sql 都会导致 order by 不能正常利用索引的有序性。

动手实践一下,初始化一张表 x

create table x(id int not null auto_increment primary key, a int ,b int,key idx(a,b));insert into x(a,b) values(1,8),(1,6),(1,3),(2,1),(2,2),(2,4),(3,7),(3,9);

索引中存储的 (a,b) 顺序如下

mysql> select * from x order by a, b;

+----+------+------+

| id | a | b |

| 3 | 1 | 3 |

| 2 | 1 | 6 |

| 1 | 1 | 8 |

| 4 | 2 | 1 |

| 5 | 2 | 2 |

| 6 | 2 | 4 |

| 7 | 3 | 7 |

| 8 | 3 | 9 |

8 rows in set (0.00 sec)

对于组合索引 (a,b) 在 where 条件中 a=2使用等值查询,explain 的 extra 字段中提示 using index ,并无额外的排序。

mysql> select * from x where a=2 order by b;+----+------+------+| id | a | b |+----+------+------+| 4 | 2 | 1 || 5 | 2 | 2 || 6 | 2 | 4 |+----+------+------+3 rows in set (0.00 sec) mysql> desc select * from x where a=2 order by b \G*************************** 1. row *************************** id: 1 select_type: SIMPLE table: x partitions: NULL type: refpossible_keys: idx key: idx key_len: 5 ref: const rows: 3 filtered: 100.00 Extra: Using index1 row in set, 1 warning (0.00 sec)

对于组合索引 (a,b) 在 where 条件中 a 使用范围查询,执行计划中出现 using filesort 排序。说明 order by b 并未利用索引的有序性,进行了额外的排序。

mysql> select * from x where a>=1 and a<3 order by b;+----+------+------+| id | a | b |+----+------+------+| 4 | 2 | 1 || 5 | 2 | 2 || 3 | 1 | 3 || 6 | 2 | 4 || 2 | 1 | 6 || 1 | 1 | 8 |+----+------+------+6 rows in set (0.00 sec) mysql> desc select * from x where a>=1 and a<3 order by b \G*************************** 1. row *************************** id: 1 select_type: SIMPLE table: x partitions: NULL type: rangepossible_keys: idx key: idx key_len: 5 ref: NULL rows: 6 filtered: 100.00 Extra: Using where; Using index; Using filesort1 row in set, 1 warning (0.01 sec)

数据 a b 在索引中的顺序和实际访问的结果顺序不一致,需要额外的排序就产生了 file sort 。

(a,b) 字段在索引中存储的顺序如下图,明显和上面的查询条件的结果顺序不一致,就导致 sql 执行计划出现额外的排序,数据量比较大的情况(比如 5000 以上)下就出现慢查。

小结

本文总结两种出现频率比较高的场景。希望开发同学看完本文之后,能设计出更合理的索引。返回搜狐,查看更多

责任编辑:

mysql数据库索引案例_MySQL 数据库案例优化分享-爱可生相关推荐

  1. mysql 数据索引使用_mysql数据库正确建立索引及使用

    普通mysql运行,数据量和访问量不大的话,是足够快的,但是当数据量和访问量剧增的时候,那么就会明显发现MySQL很慢,甚至down掉,那么就要考虑优化我们的mysql了.其中优化mysql的一个重要 ...

  2. mysql建立索引 性能测试_mysql数据库索引的建立以及性能测试

    ##---------mysql学习(四)索引的建立--------### #今天突然开窍了,所以补充点索引方面的知识. #创建索引,这里仍然以数据较少的mytab表为例: #原数据为: mysql& ...

  3. MySQL 的索引是什么?怎么优化?

    转载自  MySQL 的索引是什么?怎么优化? 摘要: 索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的 ...

  4. MySQL 的索引、执行计划、优化器算法

    SQL处理流程 INDEX 索引 索引介绍 索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键key,索引通过存储引擎实现: 索引相当于一本书的目录,可以优化查询. 优点: 索引 ...

  5. MySQL8.0 物理克隆接口_技术实战 MySQL 8.0.17 克隆插件分享-爱可生

    原标题:技术实战 MySQL 8.0.17 克隆插件分享-爱可生 背景 很神奇,5.7.17 和 8.0.17,连续两个17小版本都让人眼前一亮.前者加入了组复制(Group Replication) ...

  6. mysql外键约束视频教学_外键约束案例_MySQL数据库 快速入门 基础+实战 视频教程_MySQL视频-51CTO学院...

    MySQL是开源免费和功能多面的小型数据库,MySQL也是目前流行通用的关系型数据库,已经被 Oracle 收购了.随着版本更新升级,加入一些高级功能,MySQL6.x 版本也开始收费.不过本教程将使 ...

  7. mysql数据库前端缓存_MySQL数据库性能优化--缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  8. mysql第四项_mysql数据库的基本介绍与操作(第四篇-mysql索引篇)

    索引概述: 索引(也就是mysql中常说的键值key)是存储引擎用户快速找到记录的一种数据结构,这是索引的基本功能,索引对于良好的性能非常关键,尤其是当表中数据量 越来越大的时候,索引对性能的影响就越 ...

  9. mysql 哈希缓存_MySQL数据库性能优化思路总结

    本文主要是自己记录在MySQL开发学习过程中遇到的数据库新能优化方向 利用缓存 缓存这个方面,可以说是一个技术,也可以说是一个思路和方向 从技术手段上讲 使用一些缓存插件,只需要确定创建.更新缓存的时 ...

最新文章

  1. AttributeError: ‘FPDF‘ object has no attribute ‘unifontsubset‘
  2. 浅析精准网络推广的基础内容
  3. SAP CRM pricing read的实现逻辑
  4. Python+Opencv根据颜色进行目标检测
  5. HDU2588 欧拉函数
  6. Echarts:Vue3中引入地图,展示不同省市数据
  7. it is not your reason to quit.
  8. Gif动图体积过大如何缩小?仅需三步教你在线压缩gif
  9. 多频子量子计算机,量子计算机研究:纠错和容错计算
  10. 卓训教育:孩子不爱学习怎么办,如何让孩子将动力内化
  11. 如火如荼的人工智能现状
  12. nginx某条日志详解
  13. 多客户端访问mysql_解决关于多客户端操作数据库并发问题
  14. idea链接阿里云服务器数据库
  15. 22061周市场回顾
  16. oracle使用PLSQL导出dmp文件一闪而过的解决办法
  17. 英雄杀-如何通关挑战
  18. 卡罗拉 (COROLLA) - 灯光开关
  19. ncode2019安装教程_nCode2019免费版
  20. C++核心——类中的const关键字

热门文章

  1. ctfshow-1024杯
  2. 基于51单片机的智能宠物喂食系统
  3. 计算机毕业设计之java+springboot基于vue的社区医院管理服务系统
  4. 厦门大学计算机专业考研真题,厦门大学2002年考研真题-计算机数据结构
  5. 英文站如何快速获取大流量
  6. 勒让德多项式Pn(x)
  7. 新中关大厦污水泵站远程监控系统解决方案
  8. 无人值守泵站监控系统
  9. 【计算机科学】【2009.05】基于神经网络的系统辨识及其在暖通空调系统(HVAC)中的应用研究
  10. 华钜同创:亚马逊Listing优化关联营销设置技巧