对于sql慢查询会考虑哪些优化?
- 分析sql语句是否添加了不必要的字段或者数据。
- 分析sql执行计划,根据分析计划图表思考优化点,是否命中索引,索引使用方式等。
- 查看sql的表结构及索引信息设置是否合理。
- 优化sql语句结构,避免结构庞大逻辑复杂的sql语句,可以将一些处理放在业务中实现。
- 按照优化点修改表结构,合理的设置索引和查询条件。
- 如果表数据量太大影响效率,可以考虑进行分表操作。
- 利用缓存,合理的将一些查询结果作为缓存,减少查询次数,减轻数据库压力。
如何查询sql的执行计划
在sql语句前面加上Explain,会输出sql语句执行的信息图表。
列 | 意义 |
---|---|
id | 该SELECT的标识 |
select_type | 该SELECT类型 |
table | SELECT的表 |
type | 查询连接类型 |
possible_keys | 可供选择的可能索引 |
key | 实际选择的索引 |
key_len | 所选索引的长度 |
rows | 所筛选的行数 |
ref | 与索引比较的列 |
Extra | 附加信息 |
在这图表其中最关键的信息就是type的值,这一列表示SQL的优化程度,依次从最优到最差分别为:system>const>eq_ref>ref>range>index>ALL。一般来说,得保证查询达到range级别,最好达到ref。 | |
type列最常见的值有如下几种 |
- const:使用PRIMARY KEY或 UNIQUE索引,通俗的说就是使用了唯一索引(获取到的是单行数据)
- ref:要比const慢一些,使用的不是唯一索引(获取到的可能有多行数据),比如仅仅使用了键的最左前缀键或者普通索引
- ref or null:与ref有点类似,不一样的是MySQL会额外去搜索有NULL值的行
- index:这个表示只是遍历了二级索引,也就是没有进行回表查询,就是之前文章说过的索引覆盖
- all:其实就是全表扫描,是最慢的那一种
- range:范围查询