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




  • 相关阅读:
    文件输入输出的管理以及管道的使用
    文件权限的管理以及acl权限列表
    安装配置Linux Squid代理服务器
    安全强化机制——SELinux
    存储系统管理(二)——Linux系统的swap分区、磁盘加密、磁盘阵列
    存储系统管理(三)——磁盘配额及lvm逻辑卷管理
    存储系统管理(一)——Linux系统的设备和分区管理
    core--线程同步
    Debian字符模式下修改显示分辨率
    core--作业
  • 原文地址:https://www.cnblogs.com/Howlet/p/12048487.html
Copyright © 2011-2022 走看看