mysql索引


 索引:帮助数据库快速查询的的排好序的数据结构

数据结构:数组:hash桶  对于= in 等查询较快,但是不支持范围查询

     二叉树:对于自增的索引,可能会成为链表

     红黑树:遍历次数也太多

     链表:查询较慢,IO次数过多

     B树:数据页 16k show dlobal status like "innodb_page_size" ,一个int类型的主键是4b +地址存储6b,16kb/(4+6)=1638.4 可以存储这么多的数据,如果是三阶的 1638.4*1638.4*16=4千万左右的数据,只用进行三次io

     B+树:data全部存储在叶子节点,所以非叶子节点存在冗余,叶子节点存在双向指针(便于范围查找)

聚簇索引:索引和数据存在一颗索引数中

非聚簇索引 :反之,叶子节点中只存储主键,节约空间,维护数据的唯一性

innodb引擎 推荐自增的整型主键:自增:防止数据库索引树进行平衡 整型:比较方便 数据小  如果不设置主键 数据库会自动增加主键

建议创建联合索引

explain:  

  +show warning: 可查看优化后的sql  不一定能执行。

  id: 值越大优先级越高,数值相同,前面的优先级更高

  select-type:simple 简单类型  primary 主查询   derived:衍生表(from 后面) subquery 子查询(非from 后面)

  table:表名(有可能是 derived+id)

  type:system(查询中只有一条数据) const(命中主键 只返回一条) eq_ref(命中主键或唯一索引  返回多条)  ref (非主键  返回多条) range(范围查询) index(扫描全索引) all(全表扫描)

  possible_key:可能用到的索引

  key:真正用到的索引

  rows: 扫描的行数 不是结果行

  key_len: 索引长度 用于判断联合索引中用了几个索引, 

    key_len计算规则如下:

    字符串,char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字或字母占1个字节,一个汉字占3个字节char(n):

    如果存汉字长度就是3n字节varchar(n):如果存汉字则长度是3n+2字节,加的2字节用来存储字符串长度,因为varchar是变长字符串数值类型

    tinyint:1字节

    smallint:2字节

    int:4字节

    bigint:8字节时间类型

    date:3字节

    timestamp:4字节

    datetime:8字节

    如果字段允许为NULL,需要1字节记录是否为NULL

  ref:索引关联字段

  extra:using index 覆盖索引 不用回表,using where 没有使用索引,用了条件 

查询中的一些规则: