SQL优化详情——MySQL(一)

202 阅读3分钟

内容大纲:

1.sql执行过程 2.什么是好sql 3.show profile查看执行过程 4.EXPLAIN性能分析 5.常见SQL优化问题

1.sql执行过程

2.什么是好SQL

尽量简单,模块化
易读、易维护
节省资源
内存
CPU
扫描的数据块要少
少排序
不造成死锁

3.show profile查看执行过程

利用show profile 查看sql的执行周期 先开启 show variables like '%profiling%' set profiling=1;

select * from xxx ;

show profiles; 显示最近的几次查询

show profile cpu,block io for query #查看程序的执行步骤

4.EXPLAIN性能分析

在编写SQL语句时我们应清楚优化器根据何种原则来使用索引,这有助于写出高性能的SQL语句。
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈
使用方式:Explain + SQL语句
例如:EXPLAIN SELECT * FROM employees;

从最好到最差依次是:

system>const>eq_ref>ref>range>index>ALL

一般来说,得保证查询至少达到range级别,最好能达到ref

常见SQL优化问题

MySQL的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理.
在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当MySQL处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
例如: 表 TAB1 16,384 条记录,表 TAB2 1 条记录.
选择TAB2作为基础表 (最好的方法) select count() from tab1,tab2 执行时间0.96秒
选择TAB2作为基础表 (不佳的方法) select count(
) from tab2,tab1 执行时间26.09秒

同样因为MySQL采用自右到左的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 同时那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.例如: (低效,执行时间156.3秒)
SELECT … FROM EMP E
WHERE SAL > 50000 AND JOB = ‘MANAGER’
AND 25 < (SELECT COUNT()
FROM EMP
WHERE MGR=E.EMPNO);
(高效,执行时间10.6秒)
SELECT …
FROM EMP E
WHERE 25 < (SELECT COUNT(
)
FROM EMP
WHERE MGR=E.EMPNO)
AND SAL > 50000 AND JOB = ‘MANAGER’;

最好不要在where字句中使用函数或表达式,如果发生类型转换,索引不生效

在下面的查询中索引得到了使用:
select * from employee where last_name like 'c%';
当通配符出现在字符串其他位置时,优化器就不能利用索引。

参考资料:www.cnblogs.com/dwlovelife/…