mysql优化查询之索引
explain sql内容 生成执行计划
重点关注的结果列
select_type = all,代表全表扫描,后面的内容不用看。
key = null,代表没有使用索引
rows显示扫描行数,数值越大,扫描行数越多,耗时越长。(行数值并不完全精确)
extra列 出现 Using filesort / Using temporary ,都是很影响数据库性能的。
优化思路
1.表的数据类型设计是否合理,遵循数据类型选取越简单越小原则
2.整理表的碎片
3.explain查询执行计划,辅助优化SQL语句
4.正确的索引优化
索引的选择
1.经常被查询的列
2.经常用于表连接的列
3.经常排序分组的列
tips:假如想要选取name作为索引,先看一下表中name的值分布情况
select count(distinct name)/count(*) from talbe_name;
查询结果值越大,代表重复值很少,选择性更高,非常适合建立索引
索引总结
优点:
1.提高数据的检索效率
2.提高聚合函数的效率
3.提高排序的效率
4.使用覆盖索引可以避免回表查询
索引的禁忌:
1.选择性地的字段不要创建索引
2.很少查询的列不要创建索引
3.大数据类型列不要创建索引
4.不要使用NULL指定列的属性,最好为NOT NULL,然后用空字符串代替空值
索引失效的情况:
1.索引扫描的行记录超过全表30%,优化器不会走索引,而是全表扫描
2.联合索引中,第一个查询条件不是最左索引列
3.联合索引中,第一个查询条件使用范围查询(<,=,<=,between),只能使用到部分索引,有ICP出现
4.模糊查询以%开头
5.两个单列索引,一个用于检索,一个用于排序。这种情况只会用到一个索引。因为查询语句最多只能使用一个索引,考虑建立联合索引。
6.对索引使用函数计算,索引直接失效
【勤则百弊皆除】

浙公网安备 33010602011771号