MySQL的优化手段

如何使用SQL性能分析工具来查看数据库的整体执行情况

特别是针对MySQL数据库。通过这些命令,可以了解数据库中各种SQL语句(SELECT、INSERT、DELETE、UPDATE)的执行频率。

  1. show global status like 'com_select'; —— 查看SELECT语句的执行次数。
  2. show global status like 'com_insert'; —— 查看INSERT语句的执行次数。
  3. show global status like 'com_delete'; —— 查看DELETE语句的执行次数。
  4. show global status like 'com_update'; —— 查看UPDATE语句的执行次数。
  5. show global status like 'com_%'; —— 使用通配符查看其他SQL语句的执行次数。

这些命令返回的是MySQL服务器当前统计的各类SQL语句执行的次数,帮助我们分析数据库的使用模式。例如:

  • 如果 com_select 的次数很高,说明数据库主要用于读操作。
  • 如果 com_insertcom_deletecom_update 的次数很高,说明数据库主要用于写操作。

慢查询:

1. 开启慢查询日志

在 MySQL 或 MariaDB 中,慢查询日志通常是默认关闭的,可以通过以下步骤开启:

方法一:临时开启(仅当前会话生效)

SET GLOBAL slow_query_log = 'ON';

方法二:永久开启(修改配置文件)

  1. 打开 MySQL 的配置文件 my.cnf(通常位于 /etc/mysql//etc/ 下)。
  2. 找到 [mysqld] 部分,添加或修改以下内容:
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow.log   # 自定义日志存放路径
    long_query_time = 1  # 设定慢查询时间阈值为 1 秒
    
  3. 重启 MySQL 服务:
    systemctl restart mysql # 或 service mysql restart

2. 查看慢查询日志

在命令行使用以下命令查看慢查询日志内容:

cat /var/log/mysql/slow.log

或者通过 SQL 查询来检查慢查询数量:

SHOW GLOBAL STATUS LIKE 'Slow_queries';

3. 分析慢查询日志

你可以使用 mysqldumpslow 命令分析慢查询日志文件:

mysqldumpslow /var/log/mysql/slow.log

SHOW PROFILES:


/*
 查看当前数据库是否支持profile操作
 */
select @@have_profiling;

/*
 査看profiling开关是否开启
 */
 select @@profiling;

/*
通过以下方式把profiling开关打开
 */
 set profiling = 1;

/*
 show profiles;
通过它可以查看执行过的所有的select语句的耗时情况。(是所有命令语句的耗时情况)
 */

 /*
  查看某个SQL语句语句在执行过程中,每个阶段的耗时情况
  show profile for query 19;

  也可以查看整个执行过程当中cpu的占用情况
  show profile cpu for query 19;
  */

explain:

1. 基本使用

你可以在任何 SELECT 查询之前加上 EXPLAIN 来查看其执行计划。例如:

EXPLAIN SELECT * FROM users WHERE id = 1;

2. EXPLAIN 的输出字段

执行 EXPLAIN 后,MySQL 会返回一个表格,包含关于查询执行计划的详细信息。以下是常见字段的解释:

id查询的标识符,表示查询的执行顺序。通常简单查询中为1,复杂的查询(如子查询或联合查询)会有多个ID。(ID越大优先级越高,id相同则遵循自上而下的顺序执行)
select_type查询的类型,例如 SIMPLE(简单查询,没有子查询或联合查询)PRIMARY(主查询),SUBQUERY(子查询),DERIVED(派生表,如 FROM 子查询)。
table被访问的表或派生表的名称。
partitions表明是否查询特定的分区表。如果没有分区,则显示 NULL
type表示连接类型,表明 MySQL 如何访问表。常见值从最优到最差包括:systemconsteq_refrefrangeindexALL(全表扫描)。
possible_keysMySQL 在执行查询时可能使用的索引。显示可以用于查询的所有索引。
key实际用于执行查询的索引。如果 NULL,则表示未使用索引。
key_len使用的索引的长度(字节数)。表示 MySQL 为该查询中的某列使用了多少部分的索引。
ref表示列与索引之间的匹配条件,通常是使用的常量或列名。
rows预计需要扫描的行数,表明 MySQL 估计为了满足查询条件需要读取多少行。
filtered表示行过滤后的百分比,显示满足 WHERE 条件的行占总行数的百分比。
Extra额外信息,可能有助于了解查询的执行过程。常见值有:Using index(全索引扫描),Using where(在获取数据后再应用 WHERE 条件),Using temporary(使用临时表)等。

3. 重要字段详解

1. id

id 字段显示了执行计划中每一步的顺序。较大的 id 表示 MySQL 会先执行它。在子查询和联合查询中,id 会显示多个值:

  • 相同 id:表示这些操作是按顺序执行的。
  • 不同 id:较大的 id 会先执行。

2. select_type

select_type 字段告诉你查询的类型,主要有以下几种:

  • SIMPLE:简单的查询,不包含子查询或联合查询。
  • PRIMARY:最外层查询。
  • SUBQUERY:子查询中的查询。
  • DERIVED:派生表,通常是子查询 FROM 中的结果集。
  • UNION:表示查询中的联合操作。

3. type

type 是一个非常重要的字段,它表明了 MySQL 在查询中是如何访问数据的,查询的效率往往与 type 的值直接相关。常见的 type 值包括:

  • ALL:全表扫描,这是效率最低的方式,通常应尽量避免。
  • index全索引扫描,这虽然比全表扫描快,但效率仍然较低。
  • range:使用索引的范围查询,表示 MySQL 只扫描符合条件的一部分数据行。
  • ref:表示使用非唯一索引进行匹配
  • eq_ref:对于主键或唯一索引的扫描,是非常高效的查询方式。
  • const/system:当查询只涉及到常量时使用,比如 WHERE id = 1,系统只需要读取一次便能返回结果,是效率最高的方式。

4. keykey_len

  • key:显示 MySQL 实际使用的索引。如果 keyNULL,表示没有使用任何索引。
  • key_len:表示 MySQL 用于索引的字节数。通常,key_len 越小,表示查询越高效。

5. rows

rows 是 MySQL 估计需要扫描的行数,越少越好。这是 MySQL 根据表的统计信息估算出的数值,它能帮助你判断查询的开销。

6. Extra

Extra 字段显示查询执行的额外信息,以下是常见的值:

  • Using where:表示 MySQL 会在获取数据后再应用 WHERE 条件过滤数据,这种情况下可能无法完全利用索引。
  • Using index:表示查询只使用索引来获取数据,而不需要访问实际的表。这是一个好的标志,通常意味着查询性能较好。
  • Using temporary:表示 MySQL 在查询过程中需要创建临时表,这通常会影响性能。
  • Using filesort:表示 MySQL 需要对结果进行排序,而不是使用索引排序,这是一个性能瓶颈。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值