本文已参与「新人创作礼」活动,一起开启掘金创作之路。
索引的分类?
- 唯一索引 UNIQUE:可以避免表中某列的值重复,但允许有空值;
- 主键索引 PRIMARY KEY:针对主键创建的索引,是一种特殊的唯一索引,不允许空值(MySQL创建主键时默认为聚集索引,但主键也可以是非聚集索引);
- 常规索引:用于快速定位特定数据
- 全文索引:会查找文本中的关键字,而不是比较索引的值
- 分区索引、复合索引、覆盖索引、虚拟索引
- 虚拟索引(Virtual):模拟索引的存在而不用真正创建一个索引,用于快速测试创建索引对执行计划的影响。没有相关的索引段,不增加存储空间的使用
InnoDB中,又可分为聚集索引和二级索引
- 聚集索引:会重新组织数据的物理地址,使数据的物理排序和索引排序一致,叶子结点存储整行数据。
优点:查询速度快,因为可以直接按照索引顺序得到数据的物理地址,对范围搜索更有效。
缺点:修改的速度较慢。
- 二级索引:二级索引叶子结点存储数据的主键,聚集索引的叶子结点存整行数据。
回表查询:查询时,例如查询条件是where name="lucy",若name字段建立了二级索引,会先通过二级索引找到主键,再到聚集索引中通过主键取数据,这个过程就是回表查询。
创建索引
创建索引时需要注意什么?
数据不要太大,不为空
- 只应建立在小字段上,而不对大文本或图片建立索引(数据越大,一页存储的数据越少,一次IO操作获取的数据越少,效率越低);
- 建立索引的字段应该非空,应该用0、特殊值或者空串代替NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息、比较运算都更加复杂。
哪些地方适合创建索引?
数据密度大,最值、查询、连接,(排序、分组、去重)
- 选择数据密度大(唯一值占总数的百分比很大)的字段作索引
- 经常作为最大最小值的字段;
- 经常被查询的字段;
- 经常用作表连接的字段;
- 经常出现在ORDER BY/GROUP BY/DISDINCT后面的字段 (排序 分组 去重);