Index

作者: 神农架村姑 | 来源:发表于2019-10-12 09:55 被阅读0次

    https://zhuanlan.zhihu.com/p/23624390
    https://zhuanlan.zhihu.com/p/57359378
    https://zhuanlan.zhihu.com/p/78982303

    索引的数据结构

    如果给表上了主键,那么表在磁盘上的存储结构就由堆状结构变成了树状结构,整个表就变成了一个索引。索引的结构顺序就是表中records的结构顺序。所以一个表只能有一个主键, 一个表只能有一个「聚集索引」

    其中树的所有结点(底部除外)的数据都是由主键字段中的数据构成,也就是通常我们指定主键的id字段。最下面部分是真正表中的数据。 假如我们执行一个SQL语句:

    select * from table where id = 1256;

    首先根据索引定位到1256这个值所在的叶结点,然后再通过叶结点取到id等于1256的数据行。



    索引能让数据库查询数据的速度上升, 而使写入数据的速度下降,因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。

    非聚集索引

    非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据。叫做回表

    覆盖索引

    不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。

    然而, 有一种例外可以不使用聚集索引就能查询出所需要的数据, 这种非主流的方法 称之为「覆盖索引」查询。

    CREATE INDEX index_name on Table (key1, key2);
    SELECT key2 FROM Table WHERE key1 = 值


    联合索引/复合索引/多字段索引

    最左前缀匹配原则 Left-Prefix Index Rule

    联合索引中的字段,只有某个字段左边的所有字段都被使用了,才能使用该字段上的索引。如,有索引INDEX idx_i1(col_a, col_b),如果查询条件为where col_b = 1,则无法使用索引idx_i1。

    联合索引中的字段,即使某个字段右边的其他字段没有被使用,该字段之前的所有字段仍然可以正常使用索引。例如,有索引INDEX idx_i2(col_a, col_b, col_c),则查询条件where col_a = 1 and col_b = 2在字段col_a和col_b上仍然可以走索引。

    最左前缀匹配原则的含义:对于一个联合索引,如果有一个SQL查询语句需要执行,则只有从索引最左边的第一个字段开始到SQL语句查询条件中不包含的字段(不含)或范围条件字段(含)为止的部分才会使用索引进行加速。

    Hash索引和B+ Tree索引的区别?

    有什么手段可以知道有没有走索引查询?

    可以通过explain查看sql语句的执行计划,通过执行计划来分析索引使用情况

    什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢?

    查询优化器 一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。 在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案。这个成本最低的方案就是所谓的执行计划。 优化过程大致如下: 1、根据搜索条件,找出所有可能使用的索引 2、计算全表扫描的代价 3、计算使用不同索引执行查询的代价 4、对比各种执行方案的代价,找出成本最低的那一个

    相关文章

      网友评论

          本文标题:Index

          本文链接:https://www.haomeiwen.com/subject/xymfmctx.html