目标:
掌握SQL调优的原则
掌握SQL调优的基本逻辑
掌握优秀SQL的编写方案
掌握何为慢SQL以及检测方案
SQL优化原则
1、减少数据量(表中数据太多可以分表,例如超过500万数据 双11一个小时一张订单表)
2、减少数据访问量(将全表扫描可以调整为基于索引去查询)
3、减少数据计算操作(将数据库中的计算拿到程序内存中计算)
SQL优化的基本逻辑
1、良好的SQL编码习惯(熟悉SQL编码规范、例如避免使用“select * “)
2、优秀SQL的编写逻辑(例如关联时遵循小表驱动大表)
3、定位需要优化的慢SQL语句(耗时多少时间的SQL是慢SQL)
4、调整优化策略并进行测试(SQL结构上的调整、索引应用)
5、按业务进行分库分表。(分表可以在应用逻辑中减少单表数据量)
优秀的SQL编写方案
1、查询时尽量避免使用 select *。
这样可以减少数据扫描以及网络开销(很多查询不需要查询所有列)
要尽量使用覆盖索引(索引中已经包含你需要的数据)、减少回表查询
如何查询会基于salary找到雇员id,然后基于雇员id再去查hire_date.(回表)
create index index_salary on employees(salary); select employee_id,salary,hire_date from employees where salary>15000
优化方案:
create index index_salary on employees(salary,hire_date);
select employee_id,salary,hire_date
from employees
where salary>15000
2、尽量避免在where子句中使用 or 作为查询条件
or可能会使索引失效,进而执行全表扫描
全表查询的效率相对基于索引查询的效率会比较低
例如:
create index index_salary on employees(salary);
select first_name,hire_date,salary
from employees
where job_id='AD_VP' or salary>15000
优化方案:将or操作换成union操作
select first_name,hire_date,salary
from employees
where job_id='AD_VP'
union all(union 是将查询结果去重)
select first_name,hire_date,salary
from employees
where salary>15000
3、where条件中尽量不要出现null值的比较
条件中包含和null值的比较时可能会不走索引,当然这也跟SQL优化器有关,优化器有时会因为数据量的多少,对是否走索引进行评估,假如它认为不走索引效率可能会更 高,可能就不走索引了。
select first_name,salary,commission_pct
from employees
where commission_pct is null
4、避免在查询中存在隐式转换
create table tb_order ( id int primary key, user_id varchar(50) not null, index index_user_id (user_id) ) select * from tb_order where user_id=1; 这里存在隐式转换,有可能不走索引 select * from tb_order where user_id='2'; 推荐
5、避免在where子句中使用 != 或 <> 操作符
标签:salary,where,employees,MySQL,sql,SQL,优化,id,select From: https://www.cnblogs.com/yangcrazy/p/17020461.html