索引结构

结构图

mysql磁盘io怎么看 mysql磁盘块_主键

说明:

绿色代表值,黄色代表指针,蓝色为磁盘块,灰色表示没有对应区域的数据。

磁盘块1中,P1指向数值小于17的磁盘块,P2指向数值大于17小于35的磁盘块,P3指向大于35的磁盘块

例子:

寻找值为29:

  1. 磁盘块1中,29大于17小于35,由磁盘块1的P2指向磁盘块3
  2. 磁盘块3中,29大于36小于30,由磁盘块3的P2指向磁盘块8
  3. 磁盘块8中,29等于29,找到了该值

那些情况下适合建立索引?

  1. 主键自动建立索引
  2. 频繁作为查询条件的字段
  3. 查询中与其他表建立外键关系的字段,外键关系建立索引
  4. 相比于单键索引,高并发场景中更倾向于建立复合索引
  5. 查询中排序的字段,排序字段若通过索引访问将大大提高排序速度
  6. 查询中统计或者分组的字段

那些情况下不要创建索引

  1. 频繁更新(增删改)的字段不创建索引
  2. where条件用不到的字段不创建索引
  3. 表记录很少
  4. 数据重复且分布均匀的表字段不应该建立索引,即:如果该数据列包含许多重复的内容,为他建立索引不会起到很大作用。(比如:14亿人的国籍,民族不适合建立索引;可枚举的xx类型、xx标志、xx类别、xx状态、true/false标志都不适合建立索引。主键ID自动建立索引:主键保证每个数据的主键值不一样,在b+树结构中能建立比较稠密的树结构,从而快速查找到每个id对应的数据,所以建立索引应该参照主键索引的思想)

explain

id     select_type     table     partitions     type     possible_keys     key     key_len     ref     rows     filtered     Extra

能干什么?

  1. 表的读取顺序
  1. id:相同时认为是一组,table从上往下执行;不同时先大后小;(衍生=DERIVED, select * from(select * from a) b,b就是衍生表)
  1. 数据读取操作的操作类型
  1. select_type
  1. simple:简单的select查询,查询中不包含子查询或者union
  2. primary:若查询中包含任何复杂的子部分,最外层查询被标记为primary
  3. subquery:select或者where列表中包含了子查询
  4. from列表中包含的子查询被标记为derived,mysql会递归这些子查询,把结果放在临时表里面
  5. union:若第二个select出现在union之后,则被标记为union;若union包含在from自居的子查询中,外层select将被标记为:derived
  6. union result:从union表中获取结果的select
  1. 哪些索引可以被使用
  2. 那些索引被实际使用
  3. 表之间的引用
  4. 每张表有多少行被优化器查询