SQL语句优化,基本介绍

来源:互联网 发布:大数据的前景分析 编辑:程序博客网 时间:2024/06/17 15:58

使用工具找出导致速度变慢的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个字符组成的字符串,

[sql] view plaincopy
  1. select hsp(sal) from emp;  
  2. create function rand_string(n INT)  
  3. returns varchar(255)  
  4. begin  
  5.     declare chars_str varchar(100) default  
  6.         'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';  
  7.     declare return_str varchar(255) default ";  
  8.     declare i int default 0;  
  9.     while i < n do  
  10.         set return_str = concat(return_str.substring(chars_str.floor(1+rand()*52),1));  
  11.         set i = i + 1;  
  12.     end while;  
  13.     return return_str;  
  14. end$$  

删除自定义函数:drop function rand_string。


随机产生一个数的函数:

[sql] view plaincopy

  1. create function rand_num()  
  2. returns int(5)  
  3. begin  
  4.     declare i int default 0;  
  5.     set i = floor(10+rand()*500);  
  6.     return i;  
  7. end$$  

这个函数用于产生海量数据:

[sql] view plaincopy
  1. delimiter$$  
  2. create procedure insert_emp(in start int(10),in max_num int(10))  
  3. begin  
  4.     declare i int default 0;  
  5.     set autocommit = 0;  
  6.     repeat  
  7.     set i = i + 1;  
  8.     insert into emp values((start+i),rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());  
  9.     until i = max_num  
  10.     end repeat;  
  11.     commit;  
  12. end$$  

调用函数,从100001号开始,产生1800000条记录。

[sql] view plaincopy
  1. delimiter;  
  2. call insert emp(100001,1800000);  

0 0