1 索引是什么

数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询,更新数据库表中的数据。

2 MySQL索引类型

  • 普通索引 Normal

普通索引(由关键字KEY或INDEX定义的索引),目的是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件字段或排序字段创建索引。选择一个数据最整齐、最紧凑的数据列来创建索引。

  • 唯一索引 Unique

与普通索引类似,不同的是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合也必须唯一。在对该列进行增或改时,首先会检查是否重复,在执行增改操作,会报约束重复的错误。

  • 全文索引 FullText

全文索引是基于相似度的查询,作用类似于like,我们常用的like也可以做模糊查询,但是对于大文本数据,使用全文索引和like效率不是一个量级的。

3 索引的数据结构

二叉查找树
二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么有如下特点:

  • 每个节点的左子树都小于此节点的值
  • 每个节点的右子树都大于此节点的值
  • 左右子树也都是二叉搜索树

顺序依次增大的时候退化为链表,时间复杂度O(n)

mysql varchar 类型索引 mysql数据索引类型_mysql

平衡二叉树
平衡二叉树:又称为AVL树,它是一颗空树或左右子树的深度差绝对值不能超过1
1.单个节点存储的信息占据的空间很小,但是分配的空间是16KB,造成资源利用率很低,浪费
2.树形结构深度很深,会带来很多IO操作,效率急剧下降

mysql varchar 类型索引 mysql数据索引类型_数据结构_02

多路平衡查找树 B
节点中存的是索引对应的内存地址,最终在B树中找到索引对应的内存地址,然后去查找对应的数据

mysql varchar 类型索引 mysql数据索引类型_mysql_03

加强版多路平衡查找树 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命令查看执行计划。

mysql varchar 类型索引 mysql数据索引类型_mysql varchar 类型索引_04

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索引及其数据结构,了解索引的实现原理,才能更好的设计优化数据库性能。