MySQL索引

前言

局部性原理:

  • 时间局部性
  1. 程序中的某条指令一旦执行,不久后该指令可能再次执行;某数据被访问过,不久后该数据可能再次被访问。产生时间局部性的典型原因是程序中存在着大量的循环操作。
  2. 时间局部性通过将近来使用的指令和数据保存到高速缓冲存储器中,并使用高速缓存的层次结构实现。
  • 空间局部性
  1. 一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。
  2. 空间局部性通常使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。

SQL定义与执行顺序:

sql语句定义的顺序

(1) SELECT 
(2) DISTINCT<select_list>
(3) FROM <left_table>
(4) <join_type> JOIN <right_table>
(5)         ON <join_condition>
(6) WHERE <where_condition>
(7) GROUP BY <group_by_list>
(8) WITH {CUBE|ROLLUP}
(9) HAVING <having_condition>
(10) ORDER BY <order_by_condition>
(11) LIMIT <limit_number>

sql语句执行顺序

(8) SELECT 
(9)DISTINCT<select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2)         ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE|ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
(11) LIMIT <limit_number>

每个操作都会产生一个虚拟表,该虚拟表作为一个处理的输入,看下执行顺序:

(1) FROM: 对FROM子句中的左表<left_table>和右表<right_table>执行笛卡儿积,产生虚拟表VT1;
(2) ON: 对虚拟表VT1进行ON筛选,只有那些符合<join_condition>的行才被插入虚拟表VT2;
(3) JOIN:如果指定了OUTER JOIN(如LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表VT2,产生虚拟表VT3。如果FROM子句包含两个以上的表,则对上一个连接生成的结果表VT3和下一个表重复执行步骤1~步骤3,直到处理完所有的表;
(4) WHERE: 对虚拟表VT3应用WHERE过滤条件,只有符合<where_condition>的记录才会被插入虚拟表VT4;
(5) GROUP By: 根据GROUP BY子句中的列,对VT4中的记录进行分组操作,产生VT5;
(6) CUBE|ROllUP: 对VT5进行CUBE或ROLLUP操作,产生表VT6;
(7) HAVING:对虚拟表VT6应用HAVING过滤器,只有符合<having_condition>的记录才会被插入到VT7;
(8) SELECT:第二次执行SELECT操作,选择指定的列,插入到虚拟表VT8中;
(9) DISTINCT: 去除重复,产生虚拟表VT9;
(10)ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10;
(11) LIMIT:取出指定街行的记录,产生虚拟表VT11,并返回给查询用户

数据库在未添加索引的时候进行查询默认的是进行全量搜索,也就是进行全局扫描,这样效率就会非常低

B+树

在这里插入图片描述

MySQL存储引擎

InnoDB 和 MyISAM是市面上比较常用的两种存储引擎

InnoDB 和 MyISAM区别:

  1. InnoDB支持主外键、事务;
  2. InnoDB是行锁,操作时候只锁一行数据,适合高并发;MyISAM是表索;
  3. InnoDB不仅缓存索引,还缓存真实数据;MyISAM只缓存索引;
  4. InnoDB需要表空间大;
  5. InnoDB关注事务,MyISAM关注性能(查);

概述

什么是索引

索引是对数据库表中一列或多列的值进行排序的一种结构(可以参照书的目录来理解),使用索引可快速访问数据库表中的特定信息。

实现原理

索引一般以文件形式存在磁盘中(也可以存于内存中),存储的索引的原理大致概括为以空间换时间。建立索引之后,会将建立索引的KEY值放在一个树上,每次以索引进行条件查询时,会去树上根据key值直接进行搜索。

MySQL为什么采用B+树作为底层实现?

  • 二叉树左右子树高度相差太大时,进行的比较次数很多,IO开销太大
  • 平衡二叉树和红黑树,也会对比很多次,而且会出现树高的问题,且每插入一个值将进行重平衡,非常的费时。
  • B树虽然解决树高的问题,但是范围查询的代价也很大
  • B+树解决了树高和范围查询的问题,但是空间消耗大

索引的优缺点

  • 优点
  1. 建立索引的列可以保证行的唯一性

  2. 建立索引可以有效缩短数据的检索时间

  3. 建立索引可以加快表与表之间的连接

  4. 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序

  • 缺点
  1. 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大

  2. 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)

  3. 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长

原文地址:https://www.cnblogs.com/isalo/p/15384183.html