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.查询注意避免索引失效

1、避免在索引列上出现null。 where book_name=null;

2、不要在索引列上进行算术运算。:select age+1 from user

3、避免实现!=或者<>、is null或者is not null、in等可能导致全表遍历的操作。

4、模糊查询只能使用右边%。

5、where语句后尽可能少用小括号、或者不要出现小括号嵌套小括号。

 

以上是关于Mysql数据库索引简介的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的索引简介

索引(简介,创建,删除)

mysql 重新整理——索引简介[七]

mysql 重新整理——索引简介[七]

MySQL 索引原理以及查询优化

5.索引简介