zoukankan      html  css  js  c++  java
  • Mysql InnoDb索引以及算法

    索引以及算法

    1、简介

    InnoDB存储引擎支持一下几种索引:

    • B+树索引
    • 全文索引
    • 哈希索引

    B+树就是常规意义的索引,不是二叉树,而是balance树。B+索引常常被误解的是,通过B+索引只能找到被查找数据所在的数据页。然后在内存中查找对应的数据。

    2、数据结构和算法

    2.1、二分查找法

     数据页中就是按照二分查找来进行具体数据的查找。

    3.1、B+树结构

    三种插入方式

    例子展示三种插入方式:

    插入28,leaf page、index page都没有满,直接插入即可

     插入70这个元素,leaf page满了,index page没有满。

    插入leaf page的情况应该为 50、55、80、65、70,中间元素为60,将60放入大index page

    然后插入95,这个时候leaf page和index page都满了,这个时候满足第三种情况。

    首先leaf page变成:75、80、85、90、95,中间元素为85,将85放到index page,leaf page变成 【75、80】、【85、90、95】

    index page变成:25、50、60、75、85,中间元素为60,将index page拆分为【25、50】、【75、85】

     3.2 B+树索引分类

    • 聚集索引:叶子节点存放一整行数据
    • 辅助索引:方便提高查询效率的索引

    聚集索引只能有一个,查询优化器多数情况采用聚集索引

    3.2.2 辅助索引

    辅助索引也叫做非聚集索引

    是不是应该加某个字段的非聚集索引

    区分度越大越应该加索引,如果所有记录某个字段只有几个值,加索引的意义就很低。

    具体的公式

    show index from t_opp_info;  

    查看表中索引的情况,关键关注cardinality

     公式为var = cardinality/总记录数量,var越接近1,索引的作用越大。

    3.2.3 联合索引的用法

    index a,bc

    index a

    select * from t where a = ''会使用索引a

    select * from t where a= '' and b = '' 会使用索引abc

    select * from t where a= '' and b = '' and c= '' 会使用索引abc

    select * from t where a= '' order by b 会使用索引abc

    select * from t where a= '' order by b,c 会使用索引abc

    select * from t where a= '' order by c 不是使用索引

    因为索引abc会把数据按照abc的方式去排序

    3.2.4 覆盖索引 

    覆盖索引指的是引擎不需要回聚集索引去查全部数据,仅仅在索引的二叉树上就可以查出来需要的数据,不需要回表。

    3.2.5 索引不生效的情况

    3.2.6 哈希算法 

    适合那些热数据,不可能把全表都放到缓存中。

    select * from t where name = '张三'

    hash(‘张三’)=003,然后从索引表的开始遍历,3次后找到hash相等的,hash值后面跟着记录所在的位置。但是该位置上可能有多条数据,这个时候遍历查找符合的元素。

  • 相关阅读:
    ADO.NET 六(DataRow DataColumn)
    ADO.NET 五(DataAdapter 与 DataSet)
    ADO.NET 四(DataReader)
    ADO.NET 三(Command)
    ADO.NET 二(Connection)
    面试知识点笔记-1
    【新弹性盒】
    设置弹性盒要用到的属性
    Vue项目模板--和--webpack自动化构建工具的---项目打包压缩使用
    Vue中使用【watch检测路由】的方法
  • 原文地址:https://www.cnblogs.com/zhangchiblog/p/14060953.html
Copyright © 2011-2022 走看看