zoukankan      html  css  js  c++  java
  • 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. 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长

  • 相关阅读:
    JS模块化规范CMD之SeaJS
    JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)
    Flex 弹性布局(****************************************************)
    使用jqMobi开发app基础:弹出内容的设计
    UVA 12232
    MVC5 Entity Framework学习之Entity Framework高级功能
    员工对什么不惬意
    有关Oracle cvu和cvuqdisk
    从Android Handler内部类到WeakReference的知识关联
    把Storyboard减轻的方法
  • 原文地址:https://www.cnblogs.com/isalo/p/15384183.html
Copyright © 2011-2022 走看看