B树
索引是有序的——B树的每个节点中关键字和左右子树都是有序的。
主索引:唯一;辅助索引:不唯一。
非聚集索引:在索引树当中,只保存数据地址,典型的代表:MYISAM
MYISAM:可以没有,主索引与辅助索引没区别?【只存地址】
InnoDB:必须有主键,对查询起至关重要作用! auto increament【自增字段作为表的主键】.【辅助索引的data域存储相应记录主键的值而不是地址】【数据+地址】
聚集索引:索引即数据,索引与数据在一起。【这种实现方式,使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引——通过辅助索引找到主键,通过主键索引到数据。】
覆盖索引:不需要经过搜索主键索引,直接就能命中目标的索引。
SQL插叙优化的一个重要指标:[Mysql的二级缓存:已查询sql为key,如果已查询数据的key相同,从缓存中取!]{前提是:表的结构不发生变化}
system > const > eq_ref > ref > range > index > All
System:查询系统内存中的数据,MYISAM中只有一条数据。
Const:直接命中,主键和唯一索引直接命中。(=)【效率最高】
eq_ref: 不论主键、外键,主键和外键只要是一对一的关系
ref:非主键、非唯一索引的一对多关系
range:是在索引上的一次范围查询
index:是在索引上的全部扫描
ALL:不在索引上的全表扫描,至少查两次
索引失效问题
【where 语句】
【1】or的左右两边 都需要有索引,索引才能生效。
【2】负向查询:not、!=、<>、!<、!>、not in、not like【MySQL优化器判断:全表扫描、索引扫描】
【3】字段名不更改:【提高索引效率】,如:com = round(500) 优于 round(com)=500;
【4】覆盖索引:ename like “%A%” 优于 “A%” 优于 ”%A“
【5】联合索引:最左匹配原则!否则不生效。
【6】即使完全符合索引生效的场景,考虑到实际数据量等原因——优化器的设计机制!
字段优化;
[1]尽可能不要留null;使用 not null
[2]尽量使用数字字段!
where子句优化【自右向左解析】
【1】过滤数据量大的条件居右放置。
【2】隐式转换问题
散列值:不建议加索引
连续值:加索引