慢查询SQL如何优化

一.什么是慢SQL?

慢SQL指的是Mysql中执行比较慢的SQL,排查慢SQL最常用的方法是通过慢查询日志来查找慢SQL。Mysql的慢查询日志是Mysql提供的一种日志记录,它用来记录Mysql中响应时间超过long_query_time值的sql,long_query_time的默认时间为10s.

二.查看慢SQL是否开启

我么可以使用show variables like '%slow_query_log%'来查看慢查询日志是否开启。

 当slow_query_log   value值为on时,表示慢查询日志功能开启。

慢查询日志如何开启

开启慢查询日志,可以使用如下 MySQL 命令:

mysql> set global slow_query_log=1

但是这种方式只对当前数据库生效,MySQL 一旦重启也会失效,如果要永久生效,就必须修改 MySQL 的配置文件 my.cnf,配置如下:

slow_query_log =1

slow_query_log_file=/tmp/mysql_slow.log

三.SQL性能下降的原因

1.等待时间长

锁表导致查询一直处于等待的状态

2.执行时间长

    (1)索引失效

     (2)查询语句写的差

    (3)关联太多的join

       (4)服务器调优以及各个参数的设置

四.慢查询优化思路:

1.优先选择优化高并发执行的sql,因为高并发的sql产生的问题更加严重

2.定位优化对象的性能瓶颈

(1)IO(数据访问消耗了太多的时间,查看是否使用了索引)

(2)CPU(数据运算花费了太多时间,数据的运算分组,排序是不是有问题)

 (3)网络带宽(加大网络带宽)

3.明确优化目标

4.explain执行计划入手

explain能告诉我们当前sql的执行状态

其中最重要的就是 type 字段,type 值类型如下:

  • all — 扫描全表数据
  • index — 遍历索引
  • range — 索引范围查找
  • index_subquery — 在子查询中使用 ref
  • unique_subquery — 在子查询中使用 eq_ref
  • ref_or_null — 对 null 进行索引的优化的 ref
  • fulltext — 使用全文索引
  • ref — 使用非唯一索引查找数据
  • eq_ref — 在 join 查询中使用主键或唯一索引关联
  • const — 将一个主键放置到 where 后面作为条件查询, MySQL 优化器就能把这次查询优化转化为一个常量,如何转化以及何时转化,这个取决于优化器,这个比 eq_ref 效率高一点。

当type的值为all的时候,说明我们索引没走,走的是全表扫描

另外通过其他的一些字段我们可以了解:

(1)表的读取顺序

(2)数据读取操作的操作类型

(3)那些索引可以被使用

(4)那些索引真正被使用

 (5)表的直接引用

 (6)每张表有多少行被优化器查询了

5.永远用小结果驱动大的结果集

 用小表驱动大表

这里我们举个例子:

如果小的循环在外层,那么连接数据库只需要10次,如果大的循环在外边,那么我们连接数据库就需要100次,这样就浪费了资源。

6.尽可能在索引中完成排序

  当我们需要对查询的语句order by的时候,如果order by后面的字段如果在索引列中,因为索引本来就是排好序的,所以速度很快,没有索引的话,就需要从表中拿数据,在内存中进行排序,如果内存空间不够还会发生落盘操作

7.只获取自己需要的列

在进行sql语句查询的时候,我们尽量避免直接select*from 表名,我们需要啥列则获取啥列

8.只使用最有效的过滤条件

并不是where 后面的条件越多越好

9.尽量避免复杂的join连接

10.检查表中数据是否过多,是否需要分库分表了

11.检查数据库实例所在的机器的性能配置,是否太低,可以适当增加资源

12.合理设计并使用索引

如何判定是否需要创建索引?

(1)如果查询的某些字段较为频繁,我们应该为他们设计索引

 (2)更新很频繁的字段不适合创建索引(索引的字段被更新,索引数据也需要更新)

  (3)不会出现在where子句的字段不应该创建索引

 (4)唯一性太差的字段不适合创建索引

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于优化 MySQL 查询SQL 语句,可以考虑以下几个方面: 1. 使用索引:确保表中的列上有适当的索引。通过分析查询执行计划,可以确定哪些索引被使用或未使用,并根据需要添加或修改索引。 2. 优化查询语句:检查查询语句是否可以优化。避免使用不必要的连接操作,使用合适的 JOIN 类型,避免使用过多的子查询或临时表。 3. 限制结果集大小:如果查询结果集非常大,但实际只需要部分结果,可以使用 LIMIT 关键字限制返回的行数。 4. 分页查询优化:对于需要分页的查询,尽量避免使用 OFFSET 关键字,它会导致 MySQL 跳过大量的行。可以使用游标或者优化查询语句结构来提高性能。 5. 缓存查询结果:对于经常被重复执行的查询,可以考虑使用缓存技术,如 Redis 或 Memcached。将查询结果缓存在内存中,可以减少对数据库的访问次数。 6. 查询字段优化:只选择需要的字段,避免不必要的数据传输和存储开销。可以使用 SELECT 指定具体字段,而不是使用 SELECT *。 7. 优化表结构:合理设计数据库表结构,避免冗余和不必要的复杂性。对于大型表,可以考虑分区、分表等技术来提高查询性能。 8. 定期优化和维护:定期分析数据库性能,并进行优化和维护操作,如重新生成索引、收集统计信息、清理无用数据等。 以上是一些常见的优化方法,根据具体情况选择适合的优化策略。可以通过 MySQL 的 EXPLAIN 关键字分析查询执行计划,找出慢查询的原因,并根据需要进行相应的优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值