SQL优化无论在工作还是面试中都是经常遇见的问题。一般优化数据优化有四个维度:硬件,系统配置,数据表结构,SQL及索引。本文将仅从SQL及索引优化入手,不会有太多原理,可以看成一些SQL语法和加索引的规范。都是个人在工作中或者其他文章中一点点积累整理的。
1. select后跟具体字段,不使用select *
2. order by后字段,尽可能为索引字段
3. group by分组时会经历排序过程,group by后也尽量跟索引字段
4. 能使用where完成的条件限定,不使用having的限定
5. 数据类型尽量简单,整数比字符使用成本更小
6. 查询时尽量减少冗余数据读取,使用where子句减少返回的记录数
7. Where后面多个限定条件,应将索引列或者过滤几率书最多的条件放前面
避免全表扫描,应考虑在where及order by等列上建立索引,并使用Explain来对select查询语句进行分析。
Explain执行计划中比较重要的字段:
select_type : 查询类型,有简单查询、联合查询、子查询等;
key : 使用的索引;
rows : 扫描的行数;
type: 表示表的连接类型;
其中type字段的值有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
index: Full Index Scan,index与ALL区别为index类型只遍历索引树
range: 只检索给定范围的行,使用一个索引来选择行
ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件。
const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system。
SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好。
如何避免索引失效?
1. 模糊查询时,%放后面,避免开头模糊查询
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。