SQL语句优化,基本介绍

使用工具找出导致速度变慢的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。

随机产生一个数的函数:
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);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值