sql 优化

优化原则

1,减少数据访问量

2,减少数据计算操作

#查询优化的方案

1,良好的编码习惯

2,优秀的sql编写逻辑

3,定位需要优化的sql,比如慢sql

4,调整优化策略,并进行测试

#优秀的查询sql编写逻辑

*查询时候,尽量避免使用select *;

1,这样就可以数据扫描和节省资源,网络开销;

2,要尽量使用覆盖索引(索引中已经包含你需要的数据),减少回表查询;

*避免在where 句中使用or 作为连接条件。

1,or可能会使 索引失效,进而执行全表查询;

2.全表查询的效率相对基于索引的查询的效率比较低。

联合查询,union 不包括重复,union all 包括重复。

*where条件尽量不要跟null值进行等值比较,要用is not null

Is not null 可以调整为 >0; (数据量比较大时候,但是>0数量比较少时)

#避免where句中使用!= 或者<>操作符

*表连接优先使用 inner join 内连接,而非外连接,使用小表驱动大表。小表放前面

*清空表中数据优先使用truncate

*插入多条数据时候可以考虑使用批量插入。

*避免在where查询条件中使用内置sql函数,导致索引失效。

*当有多个查询条件、分组条件、排序条件时,尽量使用联合索引(组合索引)。

*使用like模糊查询,避免在查询条件前面在%,导致索引失效。

*表设计时,字段类型能用简单数据类型,不用复杂类型。

Create index index_salary on employees (salary) using Btree;

#慢查询分析

如何定位,方案有两种

1,查询慢查询日志,确定

2,show processlist 查询正在执行的慢查询

#如何慢查询分析?

1,开启慢查询日志,默认关闭状态;

2,设置慢查询阈值

3,确定慢查询路径文件

4,确定文件名

#如何开启慢查询日志?
mysql >  set global slow_query_log=on;
Show variables like ‘%slow_query_log’;
#设置阈值?
set global long_query_time=1;
一般1秒,要求高的设置0.1秒
测试可设为0.
#慢查询日志路径?show 。。。datadir
#文件名?。。。file
#慢查询分析?explain,show profile
查询每个部门最低薪资的员工的信息
derived : from 子句后的相对比较复杂的查询,派生表 临时表
union 联合
Select ….from…
Union
Select…from …
simple 不包括
primary 最外层
subquery select里层子查询
#查询等级
system>const>eq_ref>ref>range>index>all
1,all 全表查询 ,性能最差
2,index
3, const 表示使用主键索引,唯一索引做等值查询的情况。
4,reg 表示使用非唯一索引进行单值查询。
Where salary=10000
5,eq_ref:出现多表join查询,表示前面
6,range 范围 >,<, in ,>=