持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情
前言
前边几篇文章我们已经了解了InnoDB数据存储相关的知识,接下来我们在来看下MySQL查询相关的知识,本文主要聊一下MySQL索引相关的内容,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教。
索引概述
大部分情况下我们表中存放的记录都是非常多的,需要很多的数据页来存储这些记录,当我们查询数据的时候如何能快速的定位到记录所在的页,难道我们要遍历所有的数据页吗?这显然是不可能的,那能不能有一个像页目录一样的东西来快速定位数据页,当然有,针对数据页做的目录我们称为索引。
索引是一种数据结构,类似于我们书的目录,用于帮助我们提升查询速度。
索引类型
根据索引的具体用途,MySQL 中的索引在逻辑上分为以下 5 类:普通索引、唯一索引、主键索引、组合索引、全文索引。
普通索引
建立在普通字段上的索引被称为普通索引。
唯一索引
索引列的所有值都只能出现一次,即必须唯一,值可以为空。
主键索引
主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。
组合索引
组合索引指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀原则。
全文索引
全文索引的索引类型为FULLTEXT,全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。全文索引可以在varchar、char、text类型的列上创建,MyISAM支持全文索引,InnoDB在mysql5.6之后支持。
索引方法
索引方法跟索引类型一定要区分开,不要混淆了,索引方法是生成索引的方式,MySQL目前主要有以下几种索引方法:B-Tree,Hash,R-Tree。
B-Tree
B-树就是B树,也是最常见的索引类型,所有值(被索引的列)都是排过序的,每个叶节点到跟节点距离相等。其具体内容等后面再说。
Hash
哈希索引是基于哈希表实现,是将索引键通过Hash运算之后,将Hash运算结果的Hash值和所对应的行指针信息存放于一个Hash表中,只有精确匹配索引所有列的查询才有效。
R-Tree
R-Tree在MySQL很少使用,仅支持geometry数据类型。
索引基本操作
查看索引
#查看索引
SHOW INDEX FROM 表名;
创建索引
CREATE [ UNIQUE |FULLTEXT] INDEX 索引名 ON 表名 ( 列名1, [列名2, ...] );
删除索引
DROP INDEX index_ name ON 表名;
索引的弊端
索引是一把双刃剑,再提供快速查询的同时,索引字段的维护也需要付出相应的代价。
- 维护索引需要耗费数据库的资源。
- 索引需要占用磁盘空间。
- 当对表的数据进行增删改的时候,增删改的速度会变慢,增删改对底层数据结构进行排序。因为要维护索引,速度会受到影响。
创建索引原则
- 较频繁的作为查询条件字段应该创建索引
- 唯一性太差的字段不适合创建索引,尽管频繁作为查询条件,例如is_delete是否删除字段
- 更新非常频繁的字段不适合作为索引
- 不会出现在where子句中的字段不该创建索引
小结
为了提升查询速度,mysql针对数据页做了一个目录我们称为索引。索引是一种数据结构。可以根据用途分为普通索引、唯一索引、主键索引、组合索引、全文索引5类。