SQL查询顺序
(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
1.为用户创建、分配处理线程。
2.登录验证
3.资源初始化
4.词法语法分析
5.权限校验
6.执行优化器
7.执行器生成执行计划,同时生成全日志、slow慢日志、binlog日志。
8.通过api操作存储引擎。
### 执行路径
1. 客户端发送一条查询给服务器;
2. 服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段;
3. 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划;
4. MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询;
5. 将结果返回给客户端
调优
数据库调优是个复杂的过程:
主要包括以下几个方面:表结构索引和SQL优化
,服务器端优化
,存储引擎优化
表结构索引优化、查看慢日志、explain查看执行计划、SQL语句优化
优化慢查询SQL:
- 根据慢日志定位慢SQL
- 使用explain分析SQL
- 修改SQL或者尽量走索引
查询慢日志:
- show variables like '%quer%';
- show status like '%slow_queries%'; # 查询慢请求状态
- set global slow_query_log = on; # 打开慢查询日志
- set global long_query_time = 1; # 设置超时时间
explain + 查询SQL;
关键字:type:
如果为index 和all 表示为全表扫描
关键字:extra:
如果为using filesort 和 using temporary 表示无法使用索引
加索引:
alter table 表名 add index idx_name(列名);
调优金字塔
设计原则:
- 查询语句无论是使用哪种判断条件 等于、小于、大于, WHERE 左侧的条件查询字段不要使用函数或者表达式
- 使用 EXPLAIN 命令优化你的 SELECT 查询,对于复杂、效率低的 sql 语句,我们通常是使用 explain sql
来分析这条 sql 语句,这样方便我们分析,进行优化。
- 当你的 SELECT 查询语句只需要使用一条记录时,要使用 LIMIT 1
- 不要直接使用 SELECT *,而应该使用具体需要查询的表字段,因为使用 EXPLAIN 进行分析时,
SELECT * 使用的是全表扫描,也就是 type = all。
- 为每一张表设置一个 ID 属性
- 避免在 WHERE 字句中对字段进行 NULL 判断
- 避免在 WHERE 中使用 != 或 <> 操作符
- 使用 BETWEEN AND 替代 IN
- 为搜索字段创建索引
- 选择正确的存储引擎,InnoDB 、MyISAM 、MEMORY 等
- 使用 LIKE %abc% 不会走索引,而使用 LIKE abc% 会走索引
- 对于枚举类型的字段(即有固定罗列值的字段),建议使用ENUM而不是VARCHAR,如性别、星期、类型、类别等
- 拆分大的 DELETE 或 INSERT 语句
- 选择合适的字段类型,选择标准是 尽可能小、尽可能定长、尽可能使用整数。
- 字段设计尽可能使用 NOT NULL
MySQL参数优化
硬件及系统配置
网友评论