索引原理

 

两种存储引擎

  • MyISAM
    不支持事务,支持表锁和全文索引,查找效率极高,适合读多写少。
  • InnoDB
    支持事务,行锁,查询性能相对低,适合写多读少。

索引分类

  • Hash
  • B-tree (基于平衡树)

聚集索引和非聚集索引

  • 非聚集索引
    类似书的目录
  • 聚集索引
    类似书的页码数字

MyISAM 的 B-tree (非聚集索引)

  • 规定:左边放小的,右边放大的
  • 索引保存的数据:
    1. 索引列的值
    2. 指向数据行的指针

物理文件:

  • MYI:存储索引
  • MYD:存储数据
  • FRM:表结构定义等

InnoDB 的 B-tree (聚集索引)

InnoDB 中只有一个聚集索引

  1. 默认会用主键id作为聚集索引
  2. 如果没有主键,会取非空的唯一索引作为聚集索引
  3. 如果上面都没有,InnoDB 会维护一个唯一id来作为聚集索引

物理文件:

  • IBD:既存索引又存数据。

索引优缺点

  • 优点:
    • 提高检索速度,降低磁盘 IO
  • 缺点:
    • 索引也需要存储空间:索引实际就是一张表
    • 字段更新(INSERT, DELETE, UPDATE)会有性能损耗

适合:

  • 频繁作为 where 条件的字段
  • 关联字段可以建索引,例如外键
  • order by,group by 的 column 可以建索引

不适合:

  • where 条件中用不到的字段
  • 频繁更新的字段
  • 数据值分布比较均匀的
  • 数据量少的

索引失效的情况

 

posted @ 2019-05-08 19:42  duniqb  阅读(110)  评论(0编辑  收藏  举报