索引是用空间换时间的操作,索引一般是通过建立额外的数据结构来实现的,适当的索引有益于加快查询速度,但过多的索引也容易导致频繁更新索引数据结构而带来的时间花销。
索引的优点:
1)使用唯一索引,可保证数据库表中每一行数据的唯一性
2)加快数据的查询速度,表的排序分组查询速度,加快表之间的连接
索引的劣势:
1)创建索引和维护索引需要耗费时间,数据量增加耗费的时间也会增加
2)索引需要占磁盘空间
3)对表进行操作的时候,索引也需要动态的进行维护
索引可以分为很多类型:
普通索引
普通索引可重复,唯一索引不可重复,普通索引是非聚簇索引,会涉及到回表的操作
如果主键的长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小
唯一索引
不允许具有索引值相同的行,系统在创建该索引的时候检查是否有重复的键值,并在每次使用INSERT语句或者UPDATE语句添加数据时候进行检查。创建唯一索引的目的不是为了提高访问速度,只是为了避免数据出现重复。
注:主键和唯一索引的区别
一张表只可以有一个主键,但是可以有多个唯一索引,多个唯一索引可以有一个记录为null。
单列索引和组合索引
单列索引是一个索引只包含单个列,一个表可以有多个单列索引
组合索引是在表的多个字段组合上创建索引,只有在查询条件中使用这些字段的左边字段索引才会使用,遵循最左前缀集合。
Mysql在查询的时候也只能使用一个索引,虽然有两个索引,但不能同时用上,只能选择最优的那个索引。
全文索引
在定义索引的列上支持全文查找,只有MyISAM引擎支持全文索引,Mysql 8.0默认是InnoDB,需要更改表结构
全文索引是为了解决需要基于相似度的查询,而不是精确数值比较。全文索引只能用于InnoDB或者MyISAM表,只能为CHAR、VARCHAR、TEXT列创建。
全文索引的限制:
1)全文索引是一个利用磁盘空间换取性能的方法
2)全文索引创建速度慢,而且对全文索引的各种数据修改操作也慢
3)区分表不支持全文搜索
4)由多列组合而成的全文检索的索引必须使用相同的字符集和排序规则
5)全文索引存在精度问题
聚簇索引和非聚簇索引
InnoDB的聚簇索引
MyISAM的非聚簇索引
(MyISAM索引占用的空间小,对一些大数据量的排序和全表扫描、统计,使用MyISAM的优势会更大一些)
A)聚簇索引优势
查询速度更快,主键和行数据是放在同一行中的,找到叶子节点就可以立即将行数据返回。
减少了辅助索引的数据页分裂时候的维护工作(使用主键作为指针不使用地址值作为指针)
只需要从磁盘读取少量的数据页就能获取信息
B) 聚簇索引劣势
维护索引昂贵,如果使用UUID作为主键,是的数据存储稀疏,会出现聚簇索引很慢的情况
索引使用的注意事项
1)字段使用函数,将不能用到索引
2)注意某些字段无引号导致的全表扫描