myesn

myEsn2E9

hi
github

MySQL 索引

简略总结#

  • 索引帮助存储引擎快速获取数据的一种数据结构,即数据的目录(就像书的目录一样),以空间换时间的设计思想
  • 分类
    • 按 [数据结构]:B+Tree 索引、Hash 索引、Full-text 索引
      • InnoDB 引擎不支持 Hash 索引
      • 创建的主键索引和二级索引默认使用的是 B+Tree 索引
    • 按 [物理存储]:聚簇索引(主键索引)、二级索引(辅助索引)
      • 主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的数据记录都存放在主键索引的 B+Tree 的叶子节点里
      • 二级索引的 B+Tree 的叶子节点存放的是主键值,而不是实际数据
        • 查询时使用二级索引:
          • 能在二级索引的 B+Tree 里查到就叫覆盖索引(仅查询二级索引的 B+Tree)
          • 查不到就还要去聚簇索引的 B+Tree 里面查,这个过程叫回表(先查询二级索引的 B+Tree 拿主键值,再去主键索引的 B+Tree 查询真正的数据)
    • 按 [字段特性]:主键索引、唯一索引、普通索引、前缀索引
      • 主键索引:建立在主键字段上的索引,一张表只能有一个主键索引,索引列的值不允许为空
      • 唯一索引:建立在 UNIQUE 字段上的索引,一张表可以有多个唯一索引,索引列的值必须唯一,允许有空值
      • 普通索引:建立在普通字段上的索引,不要求字段为主键,也不要求字段为 UNIQUE
      • 前缀索引:指对字符串类型字段的前几个字符建立的索引,而不是整个字段上建立的索引,节省索引存储空间,提升查询效率
        • 允许的字段类型:char、varchar、binary、varbinary
    • 按 [字段个数]:单列索引、联合索引
      • 单列索引:建立在单列上
      • 联合索引:建立在多列上
  • 索引适用案例
    • 字段值唯一性,比如商品编码
    • 经常用于 where 查询条件的字段
    • 经常用于 group by 和 order by 的字段
  • 索引不适用案例(反例)
    • where 条件、group by、order by 里用不到的字段
    • 字段中存在大量重复数据(即值分布均匀),比如性别
    • 数据太少时
    • 经常更新的字段
  • 索引优化
    • 前缀索引优化
    • 覆盖索引优化
    • 主键索引最好自增
    • 索引列设置 NOT NULL
    • 防止索引失效

参考#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。