MySql索引性能优化
目录
索引定义
索引结构
索引语法
创建索引
查看索引
删除索引
索引分类
索引失效检查
索引定义
索引就相当于书籍的目录一样,通过索引我们能快速定位到自己想要的数据,而不是一条数据一条数据依次检索
索引结构
MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。
我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree 结构组织的索引。
B+Tree结构:
-
每一个节点,可以存储多个key(有n个key,就有n个指针)
-
节点分为:叶子节点、非叶子节点
-
叶子节点,就是最后一层子节点,所有的数据都存储在叶子节点上
-
非叶子节点,不是树结构最下面的节点,用于索引数据,存储的的是:key+指针
-
-
为了提高范围查询效率,叶子节点形成了一个双向链表,便于数据的排序及区间范围查询
索引语法
创建索引
create
[ unique ] index 索引名 on 表名 (字段名,... ) ;
案例:为device_data 表的iot_id和product_key
创建索引的选择,一般情况下,使用那些字段查询的比较多,就使用那些字段来创建索引
注意事项:
-
主键字段,在建表时,会自动创建主键索引
-
添加唯一约束时,数据库实际上会添加唯一索引
查看索引
删除索引
索引分类
在MySQL数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。
分类 | 含义 | 特点 | 关键字 |
主键索引 | 针对于表中主键创建的索引 | 默认自动创建, 只能有一个 | PRIMARY |
唯一索引 | 避免同一个表中某数据列中的值重复 | 可以有多个 | UNIQUE |
常规索引 | 快速定位特定数据 | 可以有多个 | |
全文索引 | 全文索引查找的是文本中的关键词,而不是比较索引中的值 | 可以有多个 | FULLTEXT |
而在在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
分类 | 含义 | 特点 |
聚集索引(Clustered Index) | 将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据 | 必须有,而且只有一个 |
二级索引(Secondary Index) | 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键 | 可以存在多个 |
聚集索引选取规则:
-
如果存在主键,主键索引就是聚集索引。
-
如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
-
如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。
回表查询: 这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取数据的方式,就称之为回表查
索引失效检查
可以采用EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息 语法:
EXPLAIN
SELECT 字段列表
FROM 表名
WHERE 条件;
-
possible_key 当前sql可能会使用到的索引
-
key 当前sql实际命中的索引
-
key_len 索引占用的大小
-
Extra 额外的优化建议
-
type 这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、 index、all
-
system:查询系统中的表
-
const:根据主键查询
-
eq_ref:主键索引查询或唯一索引查询
-
ref:索引查询
-
range:范围查询
-
index:索引树扫描
-
all:全盘扫描
-
-
索引失效场景
-
不符合最左匹配法则
-
三个字段的索引(name,age,address)
-