mysql 怎么优化慢sql

分析慢sql的执行情况

通过开启慢sql的日志找到执行较慢的sql语句,怎么找慢sql可以查看我的文章:mysql怎么找慢sql
例如我找到的慢sql语句为: select * from user;
执行:explain select * from user;即可分析sql的执行情况
mysql 怎么优化慢sql_第1张图片

优化思路

mysql中针对慢sql的优化思路有如下几种:

使用索引:使用 EXPLAIN命令来分析查询计划,确定是否使用了适当的索引。

优化查询语句:检查查询语句是否可以进行优化。避免不必要的连接、子查询和重复的计算。优化查询中的 WHERE 条件,使用合适的操作符和函数。

避免全表扫描:尽量避免对整个表进行扫描,特别是在大表上。通过使用索引、分区表、分页查询或者优化查询条件,减少全表扫描的需求。

优化表结构:审查表的结构,确保列的数据类型和长度合理。避免使用过多的列和冗余的数据。通过垂直拆分和水平拆分等技术,将大表拆分成更小的表。

配置合适的缓存和缓冲区:适当调整 MySQL 的缓存和缓冲区设置,如查询缓存、键缓存、查询缓冲区等,以提高查询性能。

避免频繁的磁盘操作:减少磁盘 I/O 操作对性能的影响。可以通过增加内存缓存、优化磁盘读写操作、使用 SSD 等方式来改善磁盘性能。

分析和监测性能:使用 MySQL 提供的性能分析工具,如慢查询日志、性能模式、查询分析器等,来识别慢 SQL 和性能瓶颈,并进行相应的优化。

调整服务器参数:根据服务器的硬件配置和负载情况,适当调整 MySQL 的配置参数,如连接数、线程池大小、缓冲区大小等,以优化性能。

其实在实际的项目中,给sql加上合适的索引一般就能解决90%的问题,也是sql优化最主要的手段和方向,当然如果项目比较特殊或者数据量较大,或者已经加了合适的索引,那可能要考虑对症下药,例如采用分库分表、增加redis缓存、增加服务端接口缓存等手段。
本文主要介绍通过explain分析sql执行情况,如何优化索引。
我们可以看到刚才的explain语句中,type返回的是ALL,表示我们的这条sql走的是全表扫描,没有走索引。如果在项目中看到一条慢sql走的是ALL,那加合适的索引一定可以提升sql的执行效率;
在这里插入图片描述
type的种类共有如下几种:
如果是绿色的类型就表示用到了合适的索引,不需要从索引层面考虑优化,如果是黄色的表示尚可接受,还可以继续优化,如果是红色的部分,表示sql急需优化。
mysql 怎么优化慢sql_第2张图片

几种sql的例子

举例说明
const:
SELECT * FROM tbl_name WHERE primary_key=1;
SELECT * FROM tbl_name
  WHERE primary_key_part1=1 AND primary_key_part2=2;


eq_ref:
SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column_part1=other_table.column
  AND ref_table.key_column_part2=1;

ref:
SELECT * FROM ref_table WHERE key_column=expr;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column_part1=other_table.column
  AND ref_table.key_column_part2=1;

ref_or_null:
SELECT * FROM ref_table
  WHERE key_column=expr OR key_column IS NULL;

range:
SELECT * FROM tbl_name
  WHERE key_column = 10;

SELECT * FROM tbl_name
  WHERE key_column BETWEEN 10 and 20;

SELECT * FROM tbl_name
  WHERE key_column IN (10,20,30);

SELECT * FROM tbl_name
  WHERE key_part1 = 10 AND key_part2 IN (10,20,30);

ALL:
select * from t_user;

你可能感兴趣的:(mysql,sql,数据库)