MySQL优化之如何查找SQL效率低的原因

 更新时间:2014年05月16日 00:48:57   作者:  
这篇文章主要介绍了MySQL优化之如何查找SQL效率低的原因 ,需要的朋友可以参考下

查询到效率低的 SQL 语句 后,可以通过 EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序,比如我们想计算 2006 年所有公司的销售额,需要关联 sales 表和 company 表,并且对 profit 字段做求和( sum )操作,相应 SQL 的执行计划如下:
mysql> explain select sum(profit) from sales a,company b where a.company_id = b.id and a.year = 2006\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 12
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 12
Extra: Using where
2 rows in set (0.00 sec)

每个列的解释如下:

•select_type :表示 SELECT 的 类型,常见的取值有 SIMPLE (简单表,即不使用表连接或者子查询)、 PRIMARY (主查询,即外层的查询)、 UNION ( UNION 中的第二个或者后面的查询语句)、 SUBQUERY (子查询中的第一个 SELECT )等。

•table :输出结果集的表。

•type :表示表的连接类型,性能由好到差的连接类型为 system (表中仅有一行,即常量表)、 const (单表中最多有一个匹配行,例如 primary key 或者 unique index )、 eq_ref (对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用 primary key 或者 unique index )、 ref (与 eq_ref 类似,区别在于不是使用 primary key 或者 unique index ,而是使用普通的索引)、 ref_or_null ( 与 ref 类似,区别在于条件中包含对 NULL 的查询 ) 、 index_merge ( 索引合并优化 ) 、 unique_subquery ( in 的后面是一个查询主键字段的子查询)、 index_subquery ( 与 unique_subquery 类似,区别在于 in 的后面是查询非唯一索引字段的子查询)、 range (单表中的范围查询)、 index (对于前面的每一行,都通过查询索引来得到数据)、 all (对于前面的每一行,都通过全表扫描来得到数据)。

•possible_keys :表示查询时,可能使用的索引。
•key :表示实际使用的索引。
•key_len :索引字段的长度。
•rows :扫描行的数量。
•Extra :执行情况的说明和描述。

在上面的例子中,已经可以确认是 对 a 表的全表扫描导致效率的不理想,那么 对 a 表的 year 字段创建索引,具体如下:

mysql> create index idx_sales_year on sales(year);
Query OK, 12 rows affected (0.01 sec)
Records: 12 Duplicates: 0 Warnings: 0
创建索引后,这条语句的执行计划如下:
mysql> explain select sum(profit) from sales a,company b where a.company_id = b.id and a.year = 2006\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ref
possible_keys: idx_sales_year
key: idx_sales_year
key_len: 4
ref: const
rows: 3
Extra:
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 12
Extra: Using where
2 rows in set (0.00 sec)

    可以发现建立索引后对 a 表需要扫描的行数明显减少(从全表扫描减少到 3 行),可见索引的使用可以大大提高数据库的访问速度,尤其在表很庞大的时候这种优势更为明显,使用索引优化 sql 是优化问题 sql 的一种常用基本方法,在后面的章节中我们会具体介绍如何使索引来优化 sql 。

相关文章

  • MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法

    MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法

    这篇文章主要介绍了MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • MySQL 替换某字段内部分内容的UPDATE语句

    MySQL 替换某字段内部分内容的UPDATE语句

    至于字段内部分内容:比如替换标题里面的产品价格,接下来为你详细介绍下UPDATE语句的写法,感兴趣的你可以参考下哈,希望可以帮助到你
    2013-03-03
  • 基于JPQL实现纯SQL语句方法详解

    基于JPQL实现纯SQL语句方法详解

    这篇文章主要介绍了基于JPQL实现纯SQL语句方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • MySQL中出现乱码问题的终极解决宝典

    MySQL中出现乱码问题的终极解决宝典

    这篇文章主要介绍了MySQL中出现乱码问题的终极解决宝典,包括编码转换和SQL数据进出等方面,无比给力,极力推荐这篇精华翻译!需要的朋友可以参考下
    2015-08-08
  • 给MySQL表中的字段设置默认值的两种方法

    给MySQL表中的字段设置默认值的两种方法

    在MySQL中,我们可以为表的字段设置默认值,以确保在插入新记录时,如果没有为该字段指定值,将使用默认值,要为MySQL表中的字段设置默认值,我们可以在创建表时或者在已存在的表上使用ALTER TABLE语句进行修改,下面将展示两种设置默认值的方法,需要的朋友可以参考下
    2023-11-11
  • 详解如何在阿里云上安装mysql

    详解如何在阿里云上安装mysql

    mysql作为轻量级开源数据库,在企业级的应用中非常的广泛。这篇文章主要介绍了详解如何在阿里云上安装mysql,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 一篇文章带你了解清楚Mysql 锁

    一篇文章带你了解清楚Mysql 锁

    这篇文章主要介绍了一篇文章带你了解清楚Mysql 锁的相关资料,需要的朋友可以参考下
    2022-11-11
  • MySQL字符串的拼接、截取、替换、查找位置实例详解

    MySQL字符串的拼接、截取、替换、查找位置实例详解

    MySQL中的字符串操作包括拼接、截取、替换和查找位置等功能,本文给大家介绍MySQL字符串的拼接、截取、替换、查找位置示例详解,感兴趣的朋友一起看看吧
    2024-09-09
  • MySQL嵌套查询实现子查询的方法

    MySQL嵌套查询实现子查询的方法

    本文主要介绍了MySQL嵌套查询实现子查询的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 聊聊MySQL的COUNT(*)的性能

    聊聊MySQL的COUNT(*)的性能

    这篇文章主要介绍了聊聊MySQL的COUNT(*)的性能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论