当前位置:  数据库>mysql

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

    来源: 互联网  发布时间:2014-10-14

    本文导语:  查询到效率低的 SQL 语句 后,可以通过 EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序,比如我们想计算 2006 年所有公司的销售额,需要关联 sales 表和 company 表...

查询到效率低的 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 = 2006G;
*************************** 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 = 2006G;
*************************** 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 data文件夹位置查找
  • mysql 数据表中查找重复记录
  • mysql实现根据多个字段查找和置顶功能
  • mysql unix准换时间格式查找指定日期数据代码
  • 一台网络服务器,做web服务,有tomcat5.0, proftpd.mysql.经常down机,从哪些地方入手查找原因?
  • MySQL 查找价格最高的图书经销商的几种SQL语句
  • MySQL慢查询查找和调优测试
  • C++操作MySQL大量数据插入效率低下的解决方法
  • mysql下普通索引和唯一索引的效率对比
  • 根据mysql慢日志监控SQL语句执行效率
  • MYSQL随机抽取查询 MySQL Order By Rand()效率问题
  • 作为Mysql Server, 哪个Linux 较高效率?
  • MySQL随机查询记录的效率测试分析
  • MySQL大表中重复字段的高效率查询方法
  • MySQL查询优化:LIMIT 1避免全表扫描提高查询效率
  • mysql数据库查询优化 mysql效率第1/3页
  • MYSQL 随机 抽取实现方法及效率分析
  • MySQL Order By Rand()效率分析
  • mysql分页原理和高效率的mysql分页查询语句
  • MySQL 联合索引与Where子句的优化 提高数据库运行效率
  • mysql中RAND()随便查询记录效率问题和解决办法分享
  • 提高MySQL中数据装载效率
  • mysql中提高Order by语句查询效率的两个思路分析
  • MySQL中Stmt 预处理提高效率问题的小研究
  • mysql中使用UDF自动同步memcached效率笔记
  • mysql下mysql-udf-http效率测试小记
  • 提高MySQL 查询效率的三个技巧第1/2页
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Mysql查询错误:ERROR:no query specified原因
  • windows7下启动mysql服务出现服务名无效的原因及解决方法
  • MySQL外键创建失败1005原因汇总
  • 在DEBIAN上手动安装MYSQL服务无法启动,请问是什么原因
  • mysql执行时间为负数的原因分析
  • mysql安装时这是什么原因啊?小弟初学!
  • 在linux下安装mysql出错的原因,学习的机会、得分的机会、奉献的计划
  • MySql事务无法回滚的原因有哪些
  • 100分给提示一下下面参数什么原因?Linux下MYSQL访问过多,谢谢
  • mysql服务器查询慢原因分析与解决方法小结
  • 要慎用mysql的enum字段的原因
  • 逐步分析MySQL从库com_insert无变化的原因
  • MYSQL数据表损坏的原因分析和修复方法小结(推荐)
  • 我在使用 rpm 安装mysql软件时出现错误,请帮忙分析一下原因,谢谢
  • 深入探寻mysql自增列导致主键重复问题的原因
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • php安装完成后如何添加mysql扩展
  • MySQL 重装MySQL后, mysql服务无法启动
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • MySQL Workbench的下载安装与使用教程
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 在Linux内安装了Mysql,无法进入Mysql.
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • 怎样在linux终端输入mysql直接进入mysql?
  • MySQL索引基本知识
  • c++中关于#include <mysql/mysql.h>的问题?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3