下面文章整理下我对mysql索引的理解

1、什么是索引

索引和表的关系可以类比于目录和书籍,它们的存在就是为了更快地检索到记录,在mysql中,索引是表的一部分,是数据记录的引用指针,只要我们愿意,我们可以设置任何一列为索引,使用的语法是index index_name(column_name1,column_name2),如果没有特别的要求,那么这个索引就是普通索引,如果使用unique index进行约束,那么这个索引就是唯一索引,如果使用primary key修饰某个字段,那么这个字段就是主键索引,如果索引包含很多列,也可以叫联合索引,上面这些都是索引的逻辑上的分类

2、索引的分类

索引可以根据数据结构,硬盘的存储方式,概念上划分为不同索引,数据结构上常见的有hash索引,b+树索引,物理存储上可以分为聚簇索引,非聚簇索引,逻辑上可以分为普通索引,唯一索引,主键索引,全文索引,联合索引。

3、索引的数据结构

常见的有hash索引和b+树索引。在不同的场景中,各有各的优势

3.1 hash索引

hash索引目前只有Memory引擎支持,hash索引的优点就是查询速度快,时间复杂度为O(1),但缺点也很明显,一是hash索引不支持范围查询,只支持等值查询,二是hash索引不支持排序操作,因为索引的大小顺序和hash后的顺序可能不太一样,三是hash索引不支持联合索引中最左匹配原则,因为hash索引,要将所有字段合并后才算hash值

3.2 B+树索引

对于B+树的理解可以看https://blog.csdn.net/jiang_wang01/article/details/113739230这位博主的文章,清晰地对比了B+树对比B树的优势,B+树的思想是二分查找,同时真正的数据存储在叶子结点,叶子结点通过链表进行串联,这样我们在范围查询的时候只要找到min和max就能定位到这段数据

4、索引的物理存储

分为聚簇索引和非聚簇索引,根本区别是数据记录的顺序是否按照索引顺序排序,聚簇索引是唯一的,它的优点就是查询快,只要找到第一个索引的记录,其余连续性的记录在磁盘中也是连续存放的,缺点就是插入新记录慢,因为涉及到相关的数据重新排序,非聚簇索引就相反,可以存在多个,同时由于B+树的叶子节点是记录的指针,所以缺点就是有时候要有回表操作,查询时可以利用覆盖索引避免回表

5、什么是全文索引

某些text字段充当普通索引时只能匹配字段最开始的几个字母(这也是最左原则的体现),所以为了可以更快检索这种场景,可以使用全文索引,
SELECT * FROM tablename
WHERE MATCH(column1, column2) AGAINST(‘word1′, ‘word2′, ‘word3′)
上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来.(例子来源于https://www.cnblogs.com/bruce1992/p/13958166.html)
不过,老版本innode不支持全文索引,1.2以后支持全文索引

6、添加索引的原则

一是查询比较少的字段不能添加索引,二是修改频繁的字段不应该添加索引,三是离散值较少的字段不能添加索引

7、最左匹配原则

最左匹配指的是联合索引时建立索引的原则,比如(name,id)会在name和(name,id)建立索引,不会对id建立索引,最左匹配原则的原理是B+树根据索引的最左的字段构建,非叶子节点根据第一个关键字进行二分,叶子节点是联合索引所有关键字的数据,所有数据根据第一个关键字排序,第二、三、四无序,当第一个第一关键字相同时,第二个关键字就有序了啊,所以当查询的时候遇到between和大于小于,后面的索引就失效了,因为后面就不是有序的了(参考https://cloud.tencent.com/developer/article/1774781),此外,因为mysql有优化器,查询条件会自动排成联合索引的顺序

8、联合索引的好处

一是联合索引减少创建索引的开销,创建一个索引等于创建n个索引,二是减少检索量,第一个索引可以排除一些数据,第二个索引可以排除剩下的一些数据,三是可以利用覆盖索引,减少回表

9、索引失效的场景

思考B+树和联合索引以及最左匹配的原理能得到不遵守最左匹配原则会失效,between和大于小于右边会失效,%在最开头会失效(https://cloud.tencent.com/developer/article/1704743)
二是索引失效考虑的是检索成本,比如is null,is not null有时会走,有时不会走,sql优化器在使用二级索引的时候会预估记录的条数,如果比例过大,那么优化器就偏向直接走聚簇索引

未完继续。。。。

原文地址:http://www.cnblogs.com/spark-cc/p/16864761.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性