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 没有使用索引,用了条件
查询中的一些规则: