1 索引是什么
数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询,更新数据库表中的数据。
2 MySQL索引类型
- 普通索引 Normal
普通索引(由关键字KEY或INDEX定义的索引),目的是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件字段或排序字段创建索引。选择一个数据最整齐、最紧凑的数据列来创建索引。
- 唯一索引 Unique
与普通索引类似,不同的是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合也必须唯一。在对该列进行增或改时,首先会检查是否重复,在执行增改操作,会报约束重复的错误。
- 全文索引 FullText
全文索引是基于相似度的查询,作用类似于like,我们常用的like也可以做模糊查询,但是对于大文本数据,使用全文索引和like效率不是一个量级的。
3 索引的数据结构
二叉查找树
二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么有如下特点:
- 每个节点的左子树都小于此节点的值
- 每个节点的右子树都大于此节点的值
- 左右子树也都是二叉搜索树
顺序依次增大的时候退化为链表,时间复杂度O(n)
平衡二叉树
平衡二叉树:又称为AVL树,它是一颗空树或左右子树的深度差绝对值不能超过1
1.单个节点存储的信息占据的空间很小,但是分配的空间是16KB,造成资源利用率很低,浪费
2.树形结构深度很深,会带来很多IO操作,效率急剧下降
多路平衡查找树 B
节点中存的是索引对应的内存地址,最终在B树中找到索引对应的内存地址,然后去查找对应的数据
加强版多路平衡查找树 B+Tree
加强版的多路平衡二叉树:叶子节点存储的具体的记录
物理数据和索引都是存储在B+树中
- 关键字数=dgree
- 内节点不存储数据
- 叶子节点有双向指针
4 聚集索引和非聚集索引
聚集索引
定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。哪些情况下是聚集索引呢?
1、主键索引
2、unique key not null
3、没有索引的情况下,rowid作为聚集索引
非聚集索引
定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。除了聚集索引以外的索引都是非聚集索引,细分一下非聚集索引,分为普通索引,唯一索引,全文索引。
5 如何建立索引
1.离散度原则
离散度比较好的字段才适合建立索引,比如性别就不适合,可使用如下公式判断:
count(distinct(column_name)):count(*)
2.最左匹配原则
6 Explain 查询优化
在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找到慢SQL之后,如何优化呢,我们可以通过看执行计划来看SQL为啥这么慢。Mysql提供了Explain命令查看执行计划。
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明
优化原则
(1)联合索引最左匹配
必须从第一个字段开始,而且不能中断
(2)覆盖索引
select的字段包含在了用到的索引中,不需要回表
标志:explain extra :Using index
例子:索引(name,phone)
select * from user where phone = ‘18388461254’ 不走索引
select name from user where phone = ‘18388461254’ 会走索引,并且是覆盖索引(优化器处理)
select phone from user where phone = ‘18388461254’ 会走索引,并且是覆盖索引(优化器处理)
总结
在哪些列上加索引,添加索引就能变快吗,为什么加了索引还是很慢,那可能是索引没用对,学习掌握MySql索引及其数据结构,了解索引的实现原理,才能更好的设计优化数据库性能。