zoukankan      html  css  js  c++  java
  • Mysql索引


    索引类似于新华字典的目录页,可以提高数据检索的效率

    创建索引时,要确保该索引是应用查询语句的条件上(WHERE)

    索引的效率取决于索引列的值是否散列

    索引也是一张表,该表保存了主键与索引字段

    建立索引也有缺点,在对表进行INSERT、UPDATE、DELETE时要维护索引文件,经常更新的表就不需要建立索引了

    索引分为:主键索引、唯一索引、普通索引



    1. 创建

    ALTER TABLE <表名> ADD [UNIQUE] INDEX indexName (字段1, 字段2, ...)
    DROP INDEX indexName ON <表名>
    
    # 创建索引的顺序,应将去重后记录较多的放前面,大多数情况下应扩索引,而不是建索引,要空间
    


    2. 存储结构

    页是Mysql的基本存储结构,里面存储了各种数据,包括行记录

    各个页组成双向链表,页里面的行记录组成单向链表

    页会为存储在那的行记录生成页目录,页目录把行记录分组,在通过主键查找时用二分法定位分组,然后就可以快速找到指定行记录

    通过非主键搜索只能从头遍历单链表,eg:

    SELECT * FROM <表名> WHERE name = "Howl"
    
    # 1. 先遍历双向链表找到对应的页
    # 2. 不是主键查询,从头遍历页内的单链表
    


    3. 索引结构

    关系数据库会自动对其创建主键索引,使用主键索引的效率是最高的,因为主键会保证绝对唯一

    有B+树和哈希,B+树的索引三层但已经足够使用了,使用哪种是引擎所决定,不是我们能干预

    B+树(log N):

    第一层:最大目录项

    第二次:普通目录项

    第三层:主键存放记录的地址,非主键存放主键和索引项

    Hash:

    没有排序

    键大量重复效率也低,哈希碰撞



    4. 聚集和非聚集索引

    聚集索引:索引键值的逻辑顺序与表中记录的物理顺序一致(主键索引,叶子节点存放记录的地址)

    非聚集索引:索引键值的逻辑顺序与表中记录的物理顺序不一致(非主键索引,叶子节点存放主键和索引项)

    使用非聚集索引查询出数据时,拿到叶子上的主键再去查到想要查找的数据,这叫回表

    若查询的字段,在索引上已满足,不用再拿主键去查,叫覆盖索引


    5. 最左匹配原则

    使用索引是从左到右匹配索引字段,前一个不匹配,后一个就不使用索引,所以总是从第一个开始匹配,因为B+树只能以一个值(即主键)来建树

    联合索引时,索引只能用于查找key是否存在或相等,遇到范围查询(>、<、between、like),就不能进一步匹配了,退化为线性查询,因此列的排列顺序决定了可命中索引的列数




    参考Java3y

    参考PostTruth




  • 相关阅读:
    PHP 使用 GET 传递数组变量
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
  • 原文地址:https://www.cnblogs.com/Howlet/p/12048487.html
Copyright © 2011-2022 走看看