IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 【Mysql系列文章(五)】InnoDb索引优化与索引规约 -> 正文阅读

[系统运维]【Mysql系列文章(五)】InnoDb索引优化与索引规约

上一篇讲解了建表规范后,本章重点分析下创建索引的一些规范
由于索引是工作在存储引擎层,所以以下规约都是基于InnoDb引擎

关于索引

索引的优点

  1. 索引大大减少了服务器需要扫描的数据量
  2. 索引可以帮助服务器避免排序和临时表
  3. 索引可以将随机I/O变为顺序I/O

缺点

  1. 索引会带来额外维护的开销,减慢写入速度

索引规约

通用原则

  1. 代码先行,索引后上。开发时建立索引步骤:建表-开发完主体业务-建索引。
  2. 利用覆盖索引来进行查询操作,减少select *,避免回表
  3. 不允许存在重复索引(指完全相同的索引),大多数时候也应该避免冗余索引(指索引被其他联合索引包含)
  4. 不要在小基数字段上建立索引,注意列的区分度(例如大多数时候性别列不应该单独建立索引)
  5. is null,is not null 一般情况下也无法使用索引
  6. mysql在使用不等于(!=或者<>),not in,not exists 的时候无法使用索引会导致全表扫描
  7. < 小于、 > 大于、 <=、>= 这些,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引
  8. 防止因字段类型不同造成的隐式转换,导致索引失效 ,例如:字符串不加单引号索引失效,数字型字段匹配字符串值等
  9. 少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、表大小等多个因素整体评 估是否使用索引,详见范围查询优化
  10. 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效
  11. 当要索引的列的值非常长时,可以考虑增加一个对应的hash列,自定义一个Hash算法(结果最好是整数)来同步更新对应的hash列,通过改为在hash列加索引查询将大大提高查询性能
  12. where和order by 冲突时,优先满足where条件,当过滤的数据集足够小时,哪怕走文件排序性能依然很高。
  13. 严禁左模糊或者全模糊,如果需要请走搜索引擎来解决
  14. 在较长的varchar上建立索引时,尽量指定索引长度。通常为前20个字符创建前缀索引能达到90%的区分度。可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定。
  15. 优化联合查询
    1. 尽量避免超过三个表的JOIN查询。
    2. 需要JOIN的字段,数据类型要保持绝对一直,包括字符集,关联字段尽量选择整数类型字段。
    3. 保证被关联表的字段一定有索引
    4. 小表驱动大表,写多表连接SQL时如果明确知道哪张表是小表可以用straight_join写法固定连接驱动方式,省去Mysql优化器自己判断的时间

注意:Mysql多表join很难优化,应尽量避免。如果一定要使用多表的大连接查询,那么请进行拆分,然后在应用中关联,好处如下:

  1. 减少锁竞争
  2. 增加缓存的可能性
  3. 可以减少冗余记录的查询。在应用层做关联,意味着对于某条记录应用只需要查询一次,而在数据库中做关联,则需要重复的访问一部分数据,这样可以减少网络和内存的消耗。
  4. Mysql的资源是非常宝贵,而且相对于应用服务器来说相对是难以扩容的,通过转移计算的压力到应用服务器,来降低Mysql的负载。

关于主键(聚簇索引)

  1. 一定要主动创建一个主键,减少mysql的工作,否则InnoDb会自动选择一个唯一的非空索引代替,若没有会隐式定义一个主键作为聚簇索引。
  2. 大多数时候建议使用自增的整型作为主键,若非顺序的主键会导致数据插入的时候可能产生较多的页分裂,降低插入速度,同时产生存储碎片,影响查询性能。当然可以根据业务特性需要聚集某些维度的数据,也可以使用其他数据列作为聚簇索引,来提高检索性能,但这需要综合评估其他操作。

Hash索引

  1. Hash索引只包含哈希值和行指针,不存储字段值,不能避免回表操作
  2. Hash索引只能执行=、IN查找,不支持索引前缀匹配,范围和排序
  3. 在区分度很低的列创建hash索引会导致大量hash冲突,性能很低,特别是更新/删除的时候

联合索引

  1. 创建联合索引时
    1. 大多数时候应该将区分度最高的列放在最左边
    2. 让联合索引尽量使用全部的列,减少通过索引筛选出来的结果集
    3. InnoDb不能使用索引中范围条件右边的列,尽量把需要范围查询的列放在最右侧(Mysql5.6引入了索引下推,可以在一定程度上优化该情况,减少回表次数,见下面的扩展阅读)
  2. 联合索引,第一个就走范围查询可能不会走索引,mysql内部可能觉得第一个字段就用范围,结果集应该很大,回表效率不高,还不如就全表扫描
  3. 控制单表索引数量,尽量避免使用单列索引,尽量使用3个左右联合索引覆盖80%业务查询场景,包括where,order by,group by,注意最左前缀原则

唯一索引还是普通索引

创建二级索引时选择 普通索引还是唯一索引?

  • 结论
    如果追求性能使用普通索引,如果追求数据唯一性使用唯一索引。
    根据墨菲定律,长久来看,只要没有唯一索引,就一定会有脏数据产生,所以在大多数时候建议选择联合索引
  • 从性能上分析
  1. 查询速度,唯一索引更快。唯一索引查找到记录就停止,普通索引需要查找到下一个不同的值出现,但mysql实际上是以页为单位读取数据,大多数时候下几条记录都通过一次I/O读取到了内存中,在内存中多做几次判断的耗时可以忽略不计
  2. 更新速度:普通索引快很多,唯一索引无法利用change buffer导致需要进行磁盘I/O读取数据到内存判断

唯一索引提升的查询速度非常有限,但是无法利用change buffer导致写操作速度下降很多。

索引合并

  1. 索引合并(index merge)指同时利用多个索引分别进行扫描,然后将扫描结果进行 合并 UNION(OR查询)或 相交 INTERSECTION (AND查询) 或者 两者皆有,在对多个索引做联合操作时,需要耗费大量CPU和内存资源在算法的缓存、排序和合并操作上,但优化器不会计算这些查询成本,导致成本被低估,有时候还不如全表扫描,应该创建联合索引避免该情况。

扩展阅读

索引下推

在5.6以后mysql引入索引下推机制,可以在索引遍历过程中,对索引中包含的所有字段先做判断,过滤掉不符合条件的记录之后再回表,可以有效的减少回表次数,索引下推只运用于二级索引。 col1 like ‘??%’ AND col2 = ‘??’ 即可能使用索引下推。

系列文章

上一篇:【Mysql系列文章(四)】InnoDb 字段类型解析及建表规约

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:51:11  更:2022-04-04 12:53:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:52:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码