绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
云数据库 GaussDB(for MySQL)如何查看和优化慢SQL
2022-06-09 14:13:06

【摘要】 慢SQL产生的主要原因有SQL编写问题、锁等待、业务实例相互干扰对IO/CPU资源征用和服务器硬件等。在业务运行中,由于SQL编写导致的慢SQL的概率大,故着重从SQL编写的优化入手,并结合具体案例进行说明。

云小课必用.png

慢SQL产生的主要原因有SQL编写问题、锁等待、业务实例相互干扰对IO/CPU资源征用和服务器硬件等。在业务运行中,由于SQL编写导致的慢SQL的概率大,故着重从SQL编写的优化入手,并结合具体案例进行说明。

如何查看慢SQL

1.   登录管理控制台。

2.   单击管理控制台左上角的1.png,选择区域和项目。

3.   在页面左上角单击1.png,选择“数据库 > 云数据库 GaussDB”。进入云数据库GaussDB控制台,在左侧导航栏选择“GaussDB(for MySQL)”。

4.   在“实例管理”页面,选择目标实例,单击实例名称,进入“基本信息”页面。

5.   在左侧导航树,单击“日志管理”。

6.   选择“慢日志”页签,查看慢SQL语句的详细信息。慢日志功能支持查看指定执行语句类型或时间段的慢日志记录。

如何进行慢SQL优化

本部分从SQL编写角度介绍慢SQL可进行的优化。

1.   字段类型转换导致不用索引,如字符串类型的不用引号,数字类型的用引号等,这有可能会用不到索引导致全表被扫描。

2.   mysql不支持函数转换,所以字段前面不能加函数,否则将用不到索引。

3.   不要在字段前面加减运算。

4.   字符串比较长的SQL语句,可以考虑对一部分内容进行索引,从而减少索引文件大小,提高写入效率。

5.   like %在前面用不到索引。

6.   根据联合索引的第二个及以后的字段单独查询用不到索引。

7.   不要使用select *。

8.   排序请尽量使用升序。

9.   or的查询尽量用union代替(Innodb)。

10.   复合索引高选择性的字段排在前面。

11.   order by/group by字段应该包括在索引当中,减少排序操作开销,效率会更高。

慢SQL优化典型案例

本部分以“mysql不支持函数转换,所以字段前面不能加函数,否则将用不到索引”优化点为例举例说明。

原SQL语句:

SELECT id,title,most_top,view_count,posttime 
FROM article where status=3 
AND catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  and 
DATEDIFF(NOW(),posttime)<=90 order by most_top desc,posttime desc limit 0,8 

1.png

原因分析:通过explain可以看出来这个语句执行慢是因为ariticle表扫描了27298行,并进行了排序。

优化步骤:

1.   初步优化,对数据量进行限制。将原SQL语句修改为:

SELECT id,title,most_top,view_count,posttime 
FROM article where status=3 
AND catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  and 
DATEDIFF(NOW(),posttime)<=90 order by most_top desc,posttime desc limit 0,8

发现进行限制时间后并没有大幅度的提高。原因每次使用datediff运算导致不走索引即慢SQL优化点的第二条。

2.   继续修改,修改为:

SELECT id,title,most_top,view_count,posttime 
FROM article where status=3 
AND catalog_id in (select catalog_id from catalog where catalog_id=17 or parent_id=17)  and 
postime>='2017-09-05' order by most_top desc,posttime desc limit 0,8

重新执行SQL后,SQL执行速度大幅提升。

来源 https://www.modb.pro/db/152345

分享好友

分享这个小栈给你的朋友们,一起进步吧。

GaussDB(for MySQL)
创建时间:2022-04-28 11:33:56
GaussDB(for MySQL)
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • itt0918
    专家
戳我,来吐槽~