sql的优化

文章目录
  1. 1. 分析
    1. 1.1. 通过 show status 命令了解各种sql的执行频率
    2. 1.2. 定位执行效率极低的sql语句
    3. 1.3. 通过EXPLAIN分析低效SQL的执行计划
    4. 1.4. 通过 show profile 分析sql
  2. 2. 索引

在应用开发初期,由于数据量小,开发人员写sql时更加注重功能实现,但当应用上线后,数据量的上升,很多sql的性能问题就逐渐显露出来,成为系统性能的瓶颈,下面介绍一些优化方法

分析

不管面对什么问题第一步肯定是分析,分析到底哪里出问题,然后再想解决方案。sql优化也不例外,所以第一步做的就是分析。

通过 show status 命令了解各种sql的执行频率

通过命令 show [global/session] status 命令获取信息。

比较关心的参数如:

  • Com_select 执行select操作的次数

  • Com_insert 执行insert的次数,批量插入只累加一次

  • Com_update 执行update的次数

  • Com_delete 执行delete的次数

针对InnoDB存储引擎,累加算法略有不同

  • Innodb_rows_read select 查询返回的行数

  • Innodb_rows_inserted 执行insert操作插入的行数

  • Innodb_rows_ updated 执行update操作更新的行数

  • Innodb_rows_delete 执行delete操作删除的行数

还有几个参数也比较重要,事物操作 Com_commit Com_rollback
数据库情况:

  • Connections 试图连接mysql服务器的次数

  • Uptime 服务器工作时间

  • Slow_queries 慢查询的次数

定位执行效率极低的sql语句

设置mysql慢查询,然后通过日志定位 见 mysql配置

通过EXPLAIN分析低效SQL的执行计划

通过上面两个步骤查到效率低的sql后,可以通过explain或者desc命令获取select语句信息
信息中的说明

  • select_type select的类型,SIMPLE 简单表、PRIMARY 主查询、UNION UNION中的第二个或后面的查询、SUBQUERY 子查询中的第一个select

  • table 输出结果的表

  • type 表示mysql在表中找到所需行的方式,或者叫访问类型,常见类型
    ALL—-index—-range—-ref—-eq_ref—-const,system—-NULL
    从左到右,性能由差到好

  • possible_keys 表示查询时可能使用的索引

  • key 表示实际使用的索引

  • key_len 使用索引字段的长度

  • rows 扫描行的数量

  • extra 执行情况的说明和描述

通过explain extended之后再输入show warnings可以看到执行之前优化器做了哪些改动

通过 show profile 分析sql

可以先通过select @@profiling查看数据库是否开启profiling

然后通过show profile查看sql执行的时间,以及query_id。然后可以通过show profile for query [query_id]查看执行过程中线程每个状态和消耗时间

索引

B-Tree 索引 大部分支持
HASH 索引 只有Memory引擎支持,适用于 key-value查询
R-Tree 索引 MyISAM 特有,用于地理空间数据类型
Full-text 全文索引 MyISAM 特有