SQL 索引——定期维护

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】隐式转换问题


散列值:不建议加索引

连续值:加索引

猜你喜欢

转载自www.cnblogs.com/macro-renzhansheng/p/12620645.html