Mysql数据库索引简介
Posted fkg4816
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql数据库索引简介相关的知识,希望对你有一定的参考价值。
1.什么是索引?
数据库索引是表中的一个特殊的数据结构,存放的记录的快速检索的值,也称为目录,被保存在一个地方,所以索引是一个存在的文件,并不是保存在内存中
索引的存在是为了在查询时,可以直接通过查询索引找到那一条记录所在的位置,而不是逐一的去检索,大大的提高的查询的效率
那么是不是每一列都建立一个索引呢?
并不是,因为对数据的操作进行增删改的时候,还回去更新索引,所以如果每一列都设置索引,会极大的影响增删改的效率
2.索引的分类
★普通索引:在任何字段上都可以创建的索引
CREATE INDEX 索引名 on 表名(列名)
★唯一索引:该列上的值不能重复。
CREATE UNIQUE INDEX 索引名 on 表名(列名)
★主键索引
表中的主键是自带主键索引,也就是说创建了主键就有主键索引
★聚合索引
CREATE INDEX 索引名 on 表名(列名1,列名2)
聚合索引按照从左到右的匹配原则。也就是必须先匹配列名1才能匹配列名2查询。
★全文索引(MyISAM独有的索引)
ALTER TABLE 表明 ADD FULLTEXT INDEX 索引名称(title, content)
适用于全文检索的环境下
全文检索相关框架:solr、 es
3.索引底层的数据结构和算法
几种数据结构:二叉树(红黑树)、hash、B-Tree、B+ Tree
索引的实现通常使用 BTree及其变种B+Tree
原因:二叉树:如果作为索引结构,那么查询的时候会从上而下逐级比较,并没有很好的提高查询效率,红黑树可以提高效率,但是数据量大,红黑树就越深,查询效率会越来越慢,同时是IO读取
BTree:节点会拿过来放到内存中,同一行上所有的节点会全部读取,比IO快很多
B+Tree:对BTree进行优化的一种更适合实现外存储索引的数据结构,非叶子节点不存储数据,只存储key,增大度(节点的数据存储个数),顺序访问指针,提高区间访问的性能
hash:适合等值查询(前提是不存在大量重复键值,如果存在重复键就会出现哈希碰撞的问题)。
哈希索引不适用的场景(为什么不用hash)
(1)不支持范围查询(经过hash算法后后,就变成不连续的了);
(2)不支持利用索引完成排序、以及like ‘xxx%’ 这样的部分模糊查询;
(3)不支持联合索引的最左前缀匹配规则;
什么是哈希索引?(Memory引擎)
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
4.查询注意避免索引失效
以上是关于Mysql数据库索引简介的主要内容,如果未能解决你的问题,请参考以下文章