数据库进阶笔记(二)——索引

数据库进阶笔记(二)——索引

  • 1.什么是索引?
  • 2.索引的优劣?
  • 3.索引分类
  • 4.基本语法
  • 5.索引结构
  • 6.哪些情况需要创建索引?
  • 7.什么情况不适合创建索引?
  • 8.explain关键字
  • 9.索引优化
  • 10.索引失效

1.什么是索引?

官方定义:索引是帮助MySQL高效获取数据的数据结构
排好序的快速查找数据结构
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些结构以某种方式指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。(B树索引)

常说的索引,如果没有特别说明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚焦索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈希索引等

2.索引的优劣?

优势:
提高数据检索的效率,降低数据库的IO成本
降低数据排序成本,降低CPU的消耗

劣势:
1.实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的
2.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行增删改操作。因为更新表MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息

3.索引分类

mysql索引分类:
1.单值索引:即一个索引只包含单个列,一个表可以有多个单列索引
2.唯一索引:索引列的值必须唯一,但允许有空值
3.复合索引:即一个索引包含多个列

4.基本语法

创建:
方式一:CREATE [UNIQUE] INDEX 索引名 ON mytable(columnname(length));
方式二:ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length))

删除:
DROP INDEX [indexName] ON mytable;

查看:
SHOW INDEX FROM table_name\G

5.索引结构

BTree索引,B+Tree索引

6.哪些情况需要创建索引?

1.主键自动建立唯一索引
2.频繁作为查询条件的字段应该创建索引
3.查询中与其他表关联的字段,外键关系建立索引
4.频繁更新的字段不适合创建索引,因为每次更新不单单是更新完了记录还会更新索引
5.Where条件里用不到的字段不创建索引
6.高并发下倾向创建组合索引
7.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度(例如 name,age,email)
8.查询中统计或分组字段

7.什么情况不适合创建索引?

1.表记录太少
2.经常增删改的表
3.如果某个字段包含太多的重复内容,就没必要建立索引。

8.explain关键字

数据库进阶笔记(二)——索引_第1张图片

名词段解释:
1.❤id:
select查询的序列号,包含一组数字,表示查询中执行select字段或操作表的顺序。有三种情况:
	1)id相同,执行顺序由上至下。
	2)id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
	3)id有部分相同,先执行id大的,id相同的由上至下执行
	
2.select_type:
查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂信息。
	1)simple:简单的select查询,查询中不包含子查询和union
	2)primary:最外层的查询
	3)subquery:在selectwhere列表中包含的子查询
	4)derived(id):在from中包含的子查询,MySQL会递归执行这些子查询,把结果放在临时表中
	5)union:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
	6)union result:从union表获取结果的select
	
3.table:
这一行数据是关于哪张表的

4.type:
显示查询是哪种级别:
从最好到最差依次是:
system>const>eq_ref>ref>range>index>ALL
一般要达到range和ref级别
	1)system:表中只有一行记录
	2)const:表示通过索引一次就找到了,const用于比较primary keyunique索引。因为只匹配一行数据,所以很快将主键置于where表中,MYSQL就能将该查询转换为一个常量。
	3)eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
	4)ref:非唯一性索引扫描,返回匹配某个单独值的所有行
	5)range:只检索给定范围的行,使用一个索引来选择行
	6)index:全索引扫描,比ALL快,因为索引文件通常比数据文件小

5.possible_keys 和 ❤key
possible_keys:显示可能应用在这张表中的索引,一个或多个。(但不一定实际使用)
key:实际使用的索引。如果为null,则没有使用索引。查询中若使用了覆盖索引,则该索引仅出现在key列表中

6.key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的

7.ref
显示索引的那一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值

8.rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。

9.❤Extra
包含不适合在其他列显示但又十分重要的信息
	1)Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序排队
	2)Using temporary:使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于order bygroup by
	3)USING index:表示相应的select操作中使用了覆盖索引,避免访问了表的数据行,效率不错。如果同时出现using where ,表明索引被用来执行索引键值的查找;如果没有,表明索引用来读取数据而非执行查找操作。
	覆盖索引:就是select的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖
	

9.索引优化

单表索引优化:直接对where、order by 和 group by后面的字段加索引;
双表索引优化:左连接建在右表,右连接建在左表;
三表索引优化:设置查询的字段为索引

10.索引失效

数据库进阶笔记(二)——索引_第2张图片
最佳左前缀法则:查询从索引的最左前列开始并且不跳过索引中的列

解决like中%加两边索引失效问题:使用覆盖索引。

在这里插入图片描述

优化总结口诀:
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
like百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;
var引号不可丢,sql高级也不难。

你可能感兴趣的:(MySQL)