数据库设计与优化
索引:目的是加快查询速度
主键索引:
1.通常自带索引
2.唯一索引
3.查询效率最高的索引
【note】建议大家尽可能使用主键索引。
唯一索引:
【1】如果某一列需要考虑到唯一性,那么可以建索引。
【2】唯一索引建议创建在数值上。
常规索引:最普通的索引。
全文索引:
【1】只适用于 char \ text等字符串类型的数据上(MYISAM数据引擎)
联合索引:
【1】不属于索引类型。
【2】属于索引的应用方式。
【注意】
1:一般来说,一张表的索引,不超过表列数24%
【1】不要对经常变动的数据加索引
【2】小数据量的表建议不要加索引
【3】查询字段位置
(>100条的数据需要加索引)
——索引需要经常进行维护。【数据量更新后】——如:进行大量的增删改以后。
【非聚集索引】——在索引树当中,只保存数据地址。典型的代表:MYISAM
【聚集索引】——索引就是数据{他们二者是在一起的}
【覆盖索引】——不需要经过搜索主键索引,直接就能命中目标的索引。
Id/select_type/table:
【1】判断SQL的执行先后
【2】判断是哪个SQL在执行
跟具体使用的数据库优化器有关:
执行计划的type:
【1】System:查询系统内存中的数据,MYSIAM中只有一条数据
【2】Const:直接命中主键,效率最高!{id=1类型}
【3】Range:范围查询{id>10类型}——是在索引上的范围查询
【4】Eq_ref:不管是主键还是外键,只要是一对一的关系。
【5】ref:非主键非唯一索引等值扫描{当一对多的情况下,eq_ref会降级}
【6】index:覆盖索引——是在索引上的全表扫描
【7】ALL:不在索引上的全表扫描;{至少查2次!}
索引失效:
XX【1】OR的两边都需要索引
mysql的二级缓存:已查询sql为key,如果已查询数据的数据key相同,则直接从缓存中获取数据。
where 查询数据默认是:从右到左的顺序解析where子句。所以过滤掉大量数据的条件建议放在where子句之后。
explain字段:【所以往往:将过滤多的放置后面,然后依次是过滤少的。】——filetere字段:过滤掉的百分比
【对于索引可能会失效的放置在where子句的左侧】
隐式转换:当两张表字符集不同的时候进行查看。
索引并不是越多越好,虽然可以提高select的效率,但同时降低了insert 和 update的效率。【insert 和 update 有可能会重建索引】
分页优化
优化SQL的步骤:
【1】常用字段
【2】选择在哪些字段上加索引
【3】判断过滤的量
散列值:不建议加索引
连续值:加索引