索引
MySQL索引底层实现原理:https://www.cnblogs.com/boothsun/p/8970952.html
索引的优缺点
优势:可以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;
劣势:索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表
索引的使用策略
a.什么时候要使用索引?
1、主键自动建立唯一索引;
2、经常作为查询条件在WHERE或者ORDER BY 语句中出现的列要建立索引;
3、作为排序的列要建立索引;
4、查询中与其他表关联的字段,外键关系建立索引
5、高并发条件下倾向组合索引;
b.什么时候不要使用索引?
1、经常增删改的列不要建立索引;
2、有大量重复的列不建立索引;
3、表记录太少不要建立索引;
索引类型:
1、FULLTEXT
即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。
全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。
2、HASH
由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
3、BTREE
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。
4、RTREE
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。对于BTREE,RTREE的优势在于范围查找。
索引种类
1.普通索引index :加速查找
2.唯一索引
3.联合索引
4.全文索引fulltext :用于搜索很长一篇文章的时候,效果最好。
5.空间索引spatial :了解就好,几乎不用
索引原理:
Mysql的两种引擎,即MyISAM和InnoDB的索引都是使用b树的变种b+树存储的(b树的结构就不多说了,简单的说就是多叉树),之所以会选择b+树,是因为mysql存储是外部存储,需要从磁盘读入内存,这是很耗时的操作,使用b+树可以有效的减少这种io读取,大幅增加速度。虽然这两种引擎都是使用的b+树存储,但是还是有一些区别的,MyISAM是使用的非聚簇索引,索引树和数据存储分开,索引树只存储索引key值和数据的地址,而且所有的索引都是存储的这个地址;InnoDB就不一样了,它规定一张表必须有主键,因为它需要通过主键来构建一个聚簇索引,将主键列key和数据都放到这棵树上,而其他辅助索引都是非聚簇索引,存的都是索引key和主键key值,它的查询机制就是先由辅助索引找到主键key,再去主键key找到数据,两次查找。此外b+树的叶子节点还添加了到顺序访问的指针,可以大大提高范围查询的效率。
索引本质:
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。
我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
Last updated
Was this helpful?