mysql优化SQL语句的一般步骤及常用方法
一、优化SQL语句的一般步骤
1. 通过show status命令了解各种SQL的执行频率
mysqladmin extended-status 或:
show [session|global]status
参数解析:
session表示当前连接的统计结果,global表示自数据库上次启动至今的统计结果。默认为session。
例如,查看当前session中所有统计参数的值:
show status like 'Com_%';
Com_xxx表示每个xxx语句执行的次数,比如,Com_select表示执行select操作的次数。通过这些参数可以了解当前数据库的应用
是以插入更新为主还是以查询操作为主。对于事务型的应用,通过Com_commit和Com_rollback可以了解事务提交和回滚的情况。
此外,以下几个参数便于用户了解数据库的基本情况。
Connections:试图连接MySQL服务器的次数。
Uptime:服务器工作时间。
Slow_queries:慢查询的次数。
2. 定位执行效率较低的SQL语句
(1)通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 写一个包含所有执行时
间超过long_query_time 秒的SQL 语句的日志文件。
(2)慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用
show processlist 命令查看当前MySQL 在进行的线程,包括线程的状态、是否锁表等,可以实时地查看SQL 的执行情况,同时对一些锁表
操作进行优化。
3. 通过explain分析低效SQL的执行计划
使用explain分析SQL可以看到SQL执行过程中是否使用索引、扫描行数量等情况。
4. 确定问题并采取相应的优化措施
确定问题所在之后就可以根据实际情况采取相应的措施,优化提高SQL执行的效率。比如,若是发现查询SQL执行时进行了全表
扫描导致了效率低下,则可以考虑在适当的字段创建索引。
二、两个简单使用的优化方法
1. 定期分析表和检查表:
(1)分析表语法:
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
(2)检查表语法:
CHECK TABLE tbl_name [, tbl_name] ... [option] ... option = {QUICK | FAST | MEDIUM | EXTENDED
| CHANGED}
CHECK TABLE 也可以检查视图是否有错误,比如在视图定义中被引用的表已不存在。
2. 定期优化表:
优化表语法:
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表(含有VARCHAR、BLOB 或TEXT 列的表)进行了很多更改,
则应使用OPTIMIZE TABLE 命令来进行表优化。这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间
浪费,但OPTIMIZE TABLE命令只对MyISAM、BDB和InnoDB表起作用。
注意:
ANALYZE、CHECK、OPTIMIZE 执行期间将对表进行锁定,因此一定注意要在数据库不繁忙的时候执行相关的操作。
三、常用SQL的优化
1. 大批量插入数据
对于MyISAM 存储引擎的表,可以通过以下方式快速的导入大量的数据。
ALTER TABLE tbl_name DISABLE KEYS;
loading the data
ALTER TABLE tbl_name ENABLE KEYS;
DISABLE KEYS和ENABLE KEYS用来打开或者关闭MyISAM表非唯一索引的更新。在导入大量的数据到一个非空的MyISAM表时,
通过设置这两个命令,可以提高导入的效率。对于导入大量数据到一个空的MyISAM表,默认就是先导入数据然后才创建索引的,所
以不用进行设置。
对于InnoDB类型的表,这种方式并不能提高导入数据的效率,可以有以下几种方式提高InnoDB表的导入效率。
(1)因为InnoDB 类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效地提高导入数据的效率。
(2)在导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一
性校验,可以提高导入的效率。
(3)如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动提交,导入结束后再执行
SET AUTOCOMMIT=1,打开自动提交,也可以提高导入的效率。
大批量插入数据示例:
load data infile '/home/mysql/film_test.txt' into table film_test2;
2. Insert语句优化
(1)如果同时从同一客户端插入很多行,尽量使用多个值表的INSERT 语句,这种方式将大大缩减客户端与数据库之间的连接、关闭等
消耗,使得效率比分开执行的单个INSERT 语句快(在一些情况中几倍)。
多值表insert语句示例:insert into test values(1,2),(1,3),(1,4)…
(2)如果从不同客户端插入很多行,能通过使用INSERT DELAYED 语句得到更高的速度。DELAYED 的含义是让INSERT 语句马上执行,
其实数据都被放在内存的队列中,并没有真正写入磁盘,这比每条语句分别插入要快的多。
(3)将索引文件和数据文件分在不同的磁盘上存放(利用建表中的选项)。
(4)如果进行批量插入,可以增加bulk_insert_buffer_size 变量值的方法来提高速度,但是,这只能对MyISAM表使用。
(5)当从一个文本文件装载一个表时,使用LOAD DATA INFILE。这通常比使用很多INSERT语句快20倍。
3. Group by语句优化
默认情况下,MySQL 对所有GROUP BY col1,col2....的字段进行排序。这与在查询中指定ORDER BY col1,col2...类似。因此,如果显式
包括一个包含相同的列的ORDER BY 子句,则对MySQL 的实际执行性能没有什么影响。如果查询包括GROUP BY 但用户想要避免排序结果的
消耗,则可以指定ORDER BY NULL禁止排序。
4. Order by语句优化
在某些情况中,MySQL可以使用一个索引来满足ORDER BY子句,而不需要额外的排序。WHERE 条件和ORDER BY 使用相同的索引,
并且ORDER BY 的顺序和索引顺序相同,并且ORDER BY的字段都是升序或者都是降序,这些情况下可以使用索引。
5. 嵌套查询优化
使用子查询可以一次性地完成很多逻辑上需要多个步骤才能完成的SQL 操作,同时也可以避免事务或者表锁死,并且写起来也很容易。
但是,有些情况下,子查询可以被更有效率的连接(JOIN)替代。连接(JOIN)之所以更有效率一些,是因为MySQL 不需要在内存中创建临时
表来完成逻辑上需要多个步骤的查询工作。
6. Or条件优化
对于含有OR 的查询子句,如果要利用索引,则OR之间的每个条件列都必须用到索引;如果没有索引,则应该考虑增加索引。OR之间的
任何一个条件没有索引的话所有涉及的索引都不会被使用,复合索引的列做OR操作的话也不会使用索引。MySQL 在处理含有OR字句的查询时,
实际是对OR 的各个字段分别查询后的结果进行了UNION。
7. 使用SQL提示
用户可以使用use index、ignore index、force index等SQL提示来进行选择SQL的执行计划。
mysql优化SQL语句的一般步骤及常用方法的更多相关文章
- MySql(五)SQL优化-优化SQL语句的一般步骤
MySql(五)SQL优化-优化SQL语句的一般步骤 一.优化SQL语句的一般步骤 1.1 通过show status命令了解各种SQL的执行频率 1.2 定位执行效率较低的SQL语句 1.3 通过e ...
- mysql优化sql语句
mysql优化sql语句 常见误区 www.2cto.com 误区1: count(1)和count(primary_key) 优于 count(*) 很多人为了统计记录条数,就使 ...
- mysql优化sql语句的方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
- 三,mysql优化--sql语句优化之索引一
1,需求:如何在一个项目中,找到慢查询的select,mysql数据库支持把慢查询语句,记录到日志中.供程序员分析.(默认不启用此功能,需要手动启用) 修改my.cnf文件(有些地方是my.ini) ...
- 30种mysql优化sql语句查询的方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...
- 30种mysql优化sql语句查询的方法<转>
转自百度文库 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否 ...
- 五,mysql优化——sql语句优化小技巧
1,大批量插入数据 (1)对于MyISAM: alter table table_name disable keys; loading data; alter table table_name ena ...
- 四,mysql优化——sql语句优化之索引二
1,在什么列适合添加索引 (1)较频繁的作为查询条件字段应该添加索引 select * from emp where empid = 2; (2)唯一性太差的字段不适合添加索引,即时频繁作为查询条件. ...
- MySQL常用SQL语句优化
推荐阅读这篇博文,索引说的非常详细到位:http://blog.linezing.com/?p=798#nav-3-2 在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要 ...
随机推荐
- FreePascal经典资料
------------------------------------------------------------------------ 这是每个版本的changelog: http://bu ...
- Python字符串的encode与decode研究心得 乱码问题解决方法
以下摘自:http://www.jb51.net/article/17560.htm 为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x ...
- SQL Server ->> 分区表上创建唯一分区索引
今天在读<Oracle高级SQL编程>这本书的时候,在关于Oracle的全局索引的章节里面有一段讲到如果对一张分区表创建一条唯一索引,而索引本身也是分区的,那就必须把分区列也加入到索引列表 ...
- eclipse启动报错 java was started but returned exit code = -805306369
前几天还工作的好好的eclipse昨天下午启动时突然报错 报错如图: 妹的,好端端突然报错,非常奇怪,关键还是返回一堆看不懂的东西,细看都是eclipse.ini里面的配置信息,看到熟悉的jdk,误以 ...
- 标准类型内建函数 cmp()介绍
内建函数cmp()用于比较两个对象obj1 和obj2, 如果obj1 小于obj2, 则返回一个负整数,如果obj1 大于obj2 则返回一个正整数, 如果obj1 等于obj2, 则返回0.它的行 ...
- emplace_back减少内存拷贝和移动
--------<深入应用C++11:代码优化与工程级应用>第2章使用C++11改进程序性能,本章将分别介绍右值引用相关的新特性.本节为大家介绍emplace_back减少内存拷贝和移动. ...
- java中参数传递
一.参数是基本类型 相当于C++传值调用,方法中的形参是实参的副本. 二.参数是类类型 类类型的参数在方法调用中,相当于C++中的传址调用.形参是实参引用同一个对象.所有形参修改则实参也修改了 三.总 ...
- dotnet il editor 调试 iis 程序
没有C#源代码,IL级别调试.听说windbg也可以,不过windbg有些难.另外il其实一般写C#程序也不熟,不过我目的只是找出异常点,到客户一般不发pdb文件,出去也是release版本,出异常( ...
- 51nod1202 子序列个数
看到a[i]<=100000觉得应该从这个方面搞.如果a[x]没出现过,f[x]=f[x-1]*2;否则f[x]=f[x-1]*2-f[pos[a[x]]-1];ans=f[n]-1,然后WA了 ...
- 【转】Windows Server 2008 以上服务器配置SMTP
建立 SMTP 伺服器 [除非特別說明,否則本主題中的內容適用於 BizTalk Server 2013 和 2013 R2.]原文链接:https://msdn.microsoft.com/zh-t ...