使用工具找出导致速度变慢的sql语句。
1,SQL优化的一般步骤:
(1)通过show status命令了解各种SQL的执行频率。
(2)定位执行效率较低的SQL语句,重点是select语句。(核心)
(3)通过explain分析低效率的SQL语句的执行情况。
(4)确定问题并采取相应的优化措施。
面试题:SQL语句有几类?
l DDL,数据定义语言,create alterdrop
l DML,数据操作语言,insert deleteupdate
l Select
l DTL,数据事务语言,commitrollback savepoint
l DCL,数据控制语句,grant revoke
通过show status 命令,可以显示你的MySQL数据库的当前状态,我们主要关心的是以“com”开头的指令。
Show status like ‘com%’显示所有以com打头的状态。
得到状态,比如com_insert 可以指示从数据库开启到现在执行过多少次insert语句。
Show status like ‘com%’等价于show status sessionlike ‘com%’。
Session就是当前规划,指的是当前控制台启动后的数据库状态。
还有一种是:show status global like ‘com%’;这个是显示数据库从启动到查询的次数。
还有几个常用的参数便于用户了解数据库的基本情况。
Connections:试图连接MySQL服务器的次数。
Uptime:服务器工作的时间(单位秒)。
Slow_queries:慢查询的次数(默认是10)。
Connections可用于测试数据库的并发量。如果值很大的话,就要考虑并发的问题了。
9124秒
Uptime用于测试服务器到目前为止的运行时间,通常时间半年的时间就应该重启一次。
重要:slow_queries慢查询,通常默认是如果一个查询语句在数据库的查询的响应时用了10秒以上才返回,就认为是慢查询。所以说,如果这个数值越高,就说明一些查询语句是有问题的。
通常认为,一个查询超过两秒,就算慢查询。
我们优化的重点就在慢查询上,默认的慢查询时间是10秒。
通过下列语句查询慢查询的时间:show variables like ‘long_query_time’
Mysql中,通过delimiter定义结束符,例如delimiter $$,把之前的结束符;改为$$,所以现在再操作数据库,这么写是不行的:select * from emp;,必须这么写:select * from emp$$。
在MySQL中自定义函数的脚本:
这个函数在给定的字符串中随机产生n个字符组成的字符串,
- select hsp(sal) from emp;
- create function rand_string(n INT)
- returns varchar(255)
- begin
- declare chars_str varchar(100) default
- 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
- declare return_str varchar(255) default ";
- declare i int default 0;
- while i < n do
- set return_str = concat(return_str.substring(chars_str.floor(1+rand()*52),1));
- set i = i + 1;
- end while;
- return return_str;
- end$$
删除自定义函数:drop function rand_string。
随机产生一个数的函数:
[sql] view plaincopy
- create function rand_num()
- returns int(5)
- begin
- declare i int default 0;
- set i = floor(10+rand()*500);
- return i;
- end$$
这个函数用于产生海量数据:
- delimiter$$
- create procedure insert_emp(in start int(10),in max_num int(10))
- begin
- declare i int default 0;
- set autocommit = 0;
- repeat
- set i = i + 1;
- insert into emp values((start+i),rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
- until i = max_num
- end repeat;
- commit;
- end$$
调用函数,从100001号开始,产生1800000条记录。
- delimiter;
- call insert emp(100001,1800000);