【Mysql高级】索引优化与性能分析初步

索引优化与性能分析初步

    • 1.什么是索引?
    • 2.索引的内部实现方法(B+树原理)
        • 二叉查找树
        • 平衡二叉树
        • B-Tree(平衡多路查找树)
        • B+Tree
    • 3.索引的优势和劣势
        • 优势
        • 劣势
    • 4.索引的分类
    • 5.Mysql索引结构
    • 6.索引的需求分析
        • 适合的情况
        • 不适合的情况
    • 7.索引性能分析
    • 8.Explain(查看执行计划)

1.什么是索引?

索引是帮助Mysql高效获取数据的一种数据结构 (排好序的快速查找的数据结构)

本质上,索引是一种 数据结构

索引的目的在于提高查找效率,类比字典
在这里插入图片描述

注:一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的方式存储在磁盘上


2.索引的内部实现方法(B+树原理)

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡

二叉查找树

二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值
【Mysql高级】索引优化与性能分析初步_第1张图片
二叉查找树可以任意地构造,同样是2,3,5,6,7,8这六个数字,也可以按照下图的方式来构造:
【Mysql高级】索引优化与性能分析初步_第2张图片
但是这棵二叉树的查询效率就低了。因此若想二叉树的查询效率尽可能高,需要这棵二叉树是平衡的,从而引出新的定义——平衡二叉树,或称AVL树

平衡二叉树

平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。下面的两张图片,左边是AVL树,它的任何节点的两个子树的高度差<=1;右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1;
【Mysql高级】索引优化与性能分析初步_第3张图片

B-Tree(平衡多路查找树)

B-Tree是为磁盘等外存储设备设计的一种平衡查找树。

系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。

B-Tree结构的数据可以让系统高效的找到数据所在的磁盘块。为了描述B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应表中的主键值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同。
【Mysql高级】索引优化与性能分析初步_第4张图片

B+Tree

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。

从上一节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
【Mysql高级】索引优化与性能分析初步_第5张图片


3.索引的优势和劣势

优势

a.提高了数据检索的效率,降低数据库IO成本

b.通过索引列对数据进行排序,降低数据排序成本,降低CPU消耗

劣势

a.实际上索引也是一张表,该表保存了主键与索引字段,所以索引列也是需要占用空间的

b.
在这里插入图片描述

c.如果Mysql有大量数据的表,就要花时间研究最优秀的索引建立,或优化查询


4.索引的分类

单值索引

一个索引中只包含单个列

唯一索引

索引列的值必须唯一,但允许为空值

复合索引

一个索引包含多个列

show index from db_index;
# 查看某个表的索引信息

drop index idx_db_index_name on db_index;
# 删除表的某个索引

【Mysql高级】索引优化与性能分析初步_第6张图片


5.Mysql索引结构

  • ①BTEE索引
  • ②Hash索引
  • ③full-text全文索引
  • ④R-Tree索引

6.索引的需求分析

适合的情况

  • ①主键自动建立唯一索引
  • ②频繁作为查询条件的应该建立索引
  • ③查询中与其他表关联的字段,外键关系建立索引
  • ④在高并发下倾向建立复合索引
  • ⑤查询排序的字段,将大大提高排序速度
  • ⑥查询统计或者分组的字段

不适合的情况

  • ①频繁更新的字段不要创建索引
  • ②where条件里用不到的字段不要创建索引
  • ③表记录太少(300万左右开始性能下降)
  • ④数据列有很多重复值且平均分配的不要建立索引(例如:性别,国籍)
    【Mysql高级】索引优化与性能分析初步_第7张图片

7.索引性能分析

Mysql Query Optimizer(查询优化器)
在这里插入图片描述
Mysql常见瓶颈
【Mysql高级】索引优化与性能分析初步_第8张图片


8.Explain(查看执行计划)

在这里插入图片描述
分析SQL语句的优劣
【Mysql高级】索引优化与性能分析初步_第9张图片
语法

explain select * from tbl_dept;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | tbl_dept | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    5 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+

# 表头分析在下一节
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+

你可能感兴趣的:(数据库,mysql,sql,数据库)