前言

很多人对数据库索引可能都是知其然却不知其所以然,对索引没有很深入的理解,在使用过程中也一知半解,导致没有办法准确高效地使用索引,甚至存在不少误用的情况,导致使用索引反而降低了系统的性能。下面就以MySQL索引为对象,通过几篇文章来带大家好好的学习下索引的知识。

索引的数据结构
索引的存储方式
索引的利弊以及高效使用

索引利弊

在前面的文章,我们学习了索引的数据结构和存储方式,下面再来理解索引的利弊也就能更加容易和清晰了。

索引的好处

a、提高数据检索的效率,降低检索过程中必须要读取得数据量,降低数据库IO成本。
b、降低数据库的排序成本。因为索引就是对字段数据进行排序后存储的,如果待排序的字段与索引键字段一致,就在取出数据后不用再次排序了,因为通过索引取得的数据已满足排序要求。另外,分组操作是先排序后分组,所以索引同样可以省略分组的排序操作,降低内存与CPU资源的消耗。
c、唯一性索引可以在数据库层面保证表中数据的唯一性。

索引的弊端

a、索引会增加 增、删、改操作所带来的IO量与调整索引的计算量。
b、索引要占用空间,随着数据量的不断增大,索引还会带来存储空间的消耗。

接下来我们再来看下如何高效的使用B+索引

索引高效使用

如何正确建立索引列

适合建立索引的列有以下特点:

  • 列的值区分度高,也就是没有太多相同的值,区分度的公式是count(distinct col)/count(*)。例如只有两个值,这样建立起来的索引树也只有两个节点,意义不大。
  • 频繁查询的列,索引的目的就是为了加快查询效率,所以在频繁查询的列建立索引的收益最高。如果是不常搜索的列,建立索引了也没多少机会用上,反而因为需要维护索引,会降低系统的维护速度和增大了空间需求。
  • 经常排序、分组的列,索引可以有效地加快排序和分组的效率
  • 经常用于连接的列(主键、外键)

不应该创建索引的的列具有下列特点:

  • 数据量很少的表,数据很少的表不需要建立索引,数据库一行一行遍历可能还更快
  • 字段的值很大的列,例如text, image类型的字段等不应该增加索引。这是因为,这些列的数据量大,建立起来的索引会很大,导致降低了索引的效率。
  • 频繁增、删、改的列不适合建索引,因为需要频繁维护索引,可能得不偿失
  • 需要参与计算的列不适合作为索引,例如where a+b=2或者where from_unixtime(created_at) = ‘xxx’

如何使用好索引

使用规则

  • 独立的列:索引使用的时候需要是独立的列,不能使用表达式和函数
  • 前缀索引:建立联合索引的时候把区分度高的索引放前面
  • 遵循最左前缀原则:使用索引的时候,从左侧开始匹配索引。对于单列索引,例如索引 A,where A like aa%可以使用到索引,而where A like %aa不会使用索引;对于组合索引,例如索引(A,B,C),where A=xxwhere A=xx and B=xxwhere A=xx and B=xx%会使用到索引,而where B=xx and C=xx用不到索引
  • 优先使用组合索引:在需要使用多个列作为条件进行查询时,使用组合索引比使用多个单列索引性能更好。例如对于where A=a and B=b,使用组合索引(A,B) 只需要查询一次索引树,而如果分开索引要去两棵树查询
  • 使用短索引,特别是主键,因为二级索引都是包含主键的,如果主键太大的话,二级索引也会很大
  • 尽量实现覆盖索引,也就是需要获取的数据在索引里就有了,这样就不需要去再查一次主键索引,例如select A from table where A=a and B=b
  • 在使用InnoDB存储引擎时,如果没有特别的需要,永远使用一个与业务无关的自增字段作为主键。使用自增字段作为主键可以让索引树插入更加高效,每次插入都是近似顺序插入。因此每次插入的时候不需要移动已有数据,因此效率很高,而且会形成一个紧凑的索引树结构。而如果使用随机主键如身份证号的话,每次插入可能在索引树的任何一个地方,索引树需要频繁的移动,分页,最后形成一个不够紧凑的索引树结构,后续需要通过OPTIMIZE TABLE来重建表并优化填充页面。

索引失效
在下列情况下,索引会失效导致全表扫描,因此我们要尽量避免以下情况出现。

  • 用or的条件,如果or其中一个条件列没有索引,则不会使用索引
  • 使用索引的时候不符合最左侧原则
  • 存在索引列的数据类型隐形转换,则用不上索引,例如列是字符串,而在where语句中用了数字,如where A=1
  • 列使用了表达式或者函数
  • 在where子句中进行null值判断
  • where 子句中使用 != 或 <> 操作符、NOT IN,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
  • 表的数据量较少,数据库判断不使用索引更快

参考资料

《高性能MySQL》
https://blog.csdn.net/apt1203JN/article/details/79587593
https://blog.csdn.net/zk3326312/java/article/details/79377680
https://www.cnblogs.com/shan1393/p/8999622.html

Enjoy it !

如果觉得文章对你有用,可以赞助我喝杯咖啡~

版权声明

转载请注明作者和文章出处
作者: X先生
https://blog.csdn.net/u013314679/article/details/105665098

MySQL索引详解之索引的利弊以及高效使用相关推荐

  1. Oracle索引详解(索引的原理,创建索引,删除索引,修改索引等)

    Oracle索引详解 一.索引概述 Oracle作为关系型数据库,用户查找数据与行的物理位置无关,表中的每一行均用一个ROWID来标识,当Oracle数据库中存储海量的记录时,就意味着有大量的ROWI ...

  2. MySQL索引详解之索引的数据结构

    前言 很多人对数据库索引可能都是知其然却不知其所以然,对索引没有很深入的理解,在使用过程中也一知半解,导致没有办法准确高效地使用索引,甚至存在不少误用的情况,导致使用索引反而降低了系统的性能.下面就以 ...

  3. mysql索引详解_MySQL索引详解

    导读:大家都知道,一个MySQL数据库能够储存大量的数据,如果要查找那一个数据,就得费好大劲从一大堆的数据中找到,即费时间又费力气,这时,索引的出现就大大减轻了数据库管理员的工作.本文介绍了数据库索引 ...

  4. mysql 织梦 索引_Mysql索引详解 建立索引的优势劣势以及索引规范

    索引是什么 索引(index)是帮助MySQL高效获取数据的数据结构 如果没有特别指明,都是指的是B树索引(多路搜索树,并不一定是二叉树)结构组织的索引 建立索引的优势和劣势 优势 提高数据检索的效率 ...

  5. mysql 联合索引详解

    mysql 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). ...

  6. mysql explain详解_数据库mysql(1)——B+TREE索引原理

    一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...

  7. 史上最简单MySQL教程详解(进阶篇)之索引及失效场合总结

    史上最简单MySQL教程详解(进阶篇)之索引及其失效场合总结 什么是索引及其作用 索引的种类 各存储引擎对于索引的支持 简单介绍索引的实现 索引的设置与分析 普通索引 唯一索引(Unique Inde ...

  8. 【肝帝一周总结:全网最全最细】☀️Mysql 索引数据结构详解与索引优化☀️《❤️记得收藏❤️》

    [肝帝一周总结:全网最全最细]☀️Mysql 索引数据结构详解与索引优化☀️<❤️记得收藏❤️> 目录

  9. MySQL字符串前缀索引详解

    MySQL字符串前缀索引详解 1. 前缀索引与全部索引概念 2. 前缀索引与全部索引数据结构 3. 前缀索引与全部索引引执行流程 4. 前缀索引长度如何取舍 5. 前缀索引对覆盖索引的影响 6. 其他 ...

最新文章

  1. Timer定时器开发
  2. MVC 中使用bootstrap-select 基础使用方法
  3. Kylin安装,Kylin网页版教程学习
  4. Mac下django简单安装配置步骤
  5. cmake 安装mysql5.6_CMAKE安装MYSQL 5.6.10
  6. 3563: DZY Loves Chinese - BZOJ
  7. linux vmstat_Linux中vmstat命令指南
  8. html给td内容加删除线,【原创】tr上加删除线-且满足一个页面多表格
  9. 《InfoGAN: Interpretable Representation Learning》翻译
  10. 【Xilinx JESD204B】针对JESD204B的一些问题解答
  11. SRTM 航天飞机雷达地形测绘使命
  12. python实现学生座位表排表
  13. 插空排序C语言(直接插入排序)
  14. 通俗易懂 高并发案例春节抢红包分析 乐观锁 悲观锁 分布式锁
  15. 简单分类模型设计与实现
  16. 【Week2 作业】A - Maze、B - Pour Water
  17. 高级JavaScript Day03 | 函数定义和调用、this、严格模式、高阶函数、闭包、递归
  18. Java 诊断利器Arthas:快速入门
  19. 【Pygame实战】曾经风靡全国的游戏,终于复活了,你小时候玩过嘛?(纸牌红心大战游戏)
  20. 富士施乐Fuji Xerox Document Centre C450 驱动

热门文章

  1. 汽车操作系统攻防综述
  2. Java配车标识英文单词怎么写_车用英语怎么写
  3. 手把手教你获得电信公网ipv6
  4. Three.js Vue 如何加载字体,和遇到问题解决: 中加载字体的问题 Uncaught SyntaxError: Unexpected token = in JSON at position 0
  5. 看雪2020CTF 守株待兔
  6. 黎曼zeta函数不需解析延拓
  7. oracle获取年初年末,月初月末,季度初季度末
  8. 前端——CSS部分总结
  9. 2010年美专利全球50强公司排名发布 IBM蝉联榜首
  10. 【JDK】win 10 / win 11:jdk 8 升级为 jdk 17