目录
1、概念
-
MYSQL官方对索引的定义为:索引(Index)是帮助MYSQL高效获取数据的数据结构。从而可以得到索引的本质:索引是数据结构。(索引文件)
-
索引的目的在于提高查询效率,可以类比字典。
-
比如:如果要查找“mysql”。我们肯定需要定位到m字母,然后在往下找到y字母,在找剩下的sql。
-
如果没有索引,那么你可能需要a---z,逐条查询,如果我们想找到java或者oracle开头的词条呢?
-
是不是觉得如果没有索引,这个事情根本没办法完成呢?
-
你可以理解为:排好序的快速查找数据结构。
1)数据本身之外,数据库还维护中一个满足特点查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。
2)索引本身就很大,不可能全部存储在内存中,因为索引往往以索引文件的形式存储在磁盘中。
3)我们平常所说的索引,如果没有特别指明,都是指B树(BTree),(多路搜索树,并不一定是二叉树)结构组织的索引。其中聚集索引,次要索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然除了B+树这种类型索引之外还有哈希索引(hash index)等
2、索引的优势和劣势
-
优势:
- 查找:类似大学图书馆建书目录索引,提高数据检索的效率,降低数据库的IO成本;
- 排序:通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。
-
劣势:
- 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间的。
- 虽然索引大大的提供了查询速度,同时会降低更新表的速度,如果对表进行增、删、改操作时,MySQL不仅要更新数据,还要更新一下索引文件。每次更新添加了索引列的字段数据,都会调整因为更新所带来的键值变化后的索引信息。
- 索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引。或者优化查询。(专业的DBA职责)
3、MYSQL索引数据结构
-
B+TREE 索引:最常见的索引类型,大部分引擎都支持B+树索引
-
HASH索引:底层数据结构是用哈希表实现,只有精确匹配索引列的查询才有效,不支持范围查询
-
R-TREE索引:空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
-
FULL Text全文索引:是一种通过建立倒排索引,快速匹配文档的方式,类似于 Lucene, Solr, ES
各存储引擎的支持
索引 | InnoDB | MyISAM | Memory |
---|---|---|---|
B+Tree索引 | 支持 | 支持 | 支持 |
Hash索引 | 不支持 | 不支持 | 支持 |
R-Tree索引 | 不支持 | 支持 | 不支持 |
Full-text | 5.6版本后支持 | 支持 | 不支持 |
1)二叉搜索树
![img](https://tva1.sinaimg.cn/large/e6c9d24egy1h13n8fppm6j20i20eq0t0.jpg)
测试数据:28、73、36、23、18、3