vlambda博客
学习文章列表

第五弹:MySQL查询和调优

第五弹:MySQL查询和调优

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:

  1. 根据慢日志定位慢SQL

  2. 使用explain分析SQL

  3. 修改SQL或者尽量走索引

查询慢日志:

  1. show variables like '%quer%';

  2. show status like '%slow_queries%'; # 查询慢请求状态

  3. set global slow_query_log = on; # 打开慢查询日志

  4. 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,如性别、星期、类型、类别等
- 拆分大的 DELETEINSERT 语句
- 选择合适的字段类型,选择标准是 尽可能小、尽可能定长、尽可能使用整数。
- 字段设计尽可能使用 NOT NULL

MySQL参数优化

硬件及系统配置