一、定义
索引是一种用于快速查询和检索数据的数据结构。
常见的索引结构:B树,B+树,Hash
索引的作用相当于一个目录。比如说:我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。
二、索引的优缺点
优点:
- 可以大大加快数据的检索速度(这也是创建索引的最主要的原因,毕竟大部分系统的读请求总是大于写请求的)
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
- 将随机IO变为顺序IO
- 帮助服务器避免排序和临时表。
- 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
缺点:
- 创建索引和维护索引需要耗费许多时间:当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率。
- 索引需要使用物理文件存储,也会耗费一定空间。
三、索引的使用场景
- 数据量较大的表:数据量较大的表查询效率较低,需要创建索引来提高查询速度。
- 经常被查询的表:经常被查询的表需要创建索引来加速查询操作。
- 进行连接操作的表:进行连接操作的表需要创建索引来提高连接效率。
四、索引类型
主键索引
数据表的主键列使用的就是主键索引。一张数据表有只能有一个主键,并且主键不能为 null,不能重复。
在 mysql 的 InnoDB 的表中,当没有显示的指定表的主键时,InnoDB 会自动先检查表中是否有唯一索引的字段,如果有,则选择该字段为默认的主键,否则 InnoDB 将会自动创建一个的自增主键( 6Byte)。
二级索引(辅助索引)
二级索引又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。
唯一索引,普通索引,前缀索引等索引属于二级索引。
PS:不懂的同学可以暂存疑,慢慢往下看,后面会有答案的,也可以自行搜索。
-
唯一索引(Unique Key) :唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
-
普通索引(Index) :普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。
-
前缀索引(Prefix) :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。
-
全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。
五、创建索引
单列索引:单列索引即由一列属性组成的索引。
联合索引(多列索引):联合索引即由多列属性组成索引。
最左前缀原则:假设创建的联合索引由三个字段组成:
ALTER TABLE table ADD INDEX index_name (num,name,age)
那么当查询的条件有为:num / (num AND name) / (num AND name AND age)时,索引才生效。所以在创建联合索引时,尽量把查询最频繁的那个字段作为最左(第一个)字段。查询的时候也尽量以这个字段为第一条件。