软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 数据库 -> 2.SQL语句本身的优化(慢查询) -> 正文阅读

[数据库]2.SQL语句本身的优化(慢查询)


[img]http://img.blog.csdn.net/20160403133135930
MySQL客户端连接成功后,通过使用show [session|global] status 命令可以提供服务器状态信息。
其中的session来表示当前的连接的统计结果,
global来表示自数据库上次启动至今的统计结果。
默认是session级别的。下面的例子:show status like ‘Com_%’;
其中Com_XXX表示XXX语句所执行的次数。重点注意:Com_select,Com_insert,Com_update,Com_delete
通过这几个参数,可以容易地了解到当前数据库的应用
是以插入更新为主还是以查询操作为主,
以及各类的SQL大致的执行比例是多少。
还有几个常用的参数便于用户了解数据库的基本情况。Connections:
试图连接MySQL服务器的次数Uptime:服务器工作的时间(单位秒)Slow_queries:慢查询的次数 (默认是慢查询时间10s)

Sql语句本身的优化
如何从一个大项目中,迅速的定位执行速度慢的语句. (定位慢查询);

①   首先我们了解mysql数据库的一些运行状态如何查询(比如想知道当前mysql运行的时间/一共执行了多少次select/update/delete.. / 当前连接)

show status

常用的:
show status like ‘uptime’ ; 
show  stauts like ‘com_select’  show stauts like ‘com_insert’ ...类推 update  delete

? show [session|global] status like .... 如果你不写  [session|global] 默认是session 会话,指取出当前窗口的执行,如果你想看所有(从mysql 启动到现在,则应该 global)

show status like ‘connections’; 
//显示慢查询次数
show status like ‘slow_queries’;

[img]http://img.blog.csdn.net/20160403135803988
[img]http://img.blog.csdn.net/20160403135818331
[img]http://img.blog.csdn.net/20160403135824550
[img]http://img.blog.csdn.net/20160403135831363
[img]http://img.blog.csdn.net/20160403135837675
netstat -an 
本地查看哪台机器连接

[img]http://img.blog.csdn.net/20160403135416486

②   如何去定位慢查询

构建一个大表(400 万)-> 存储过程构建

默认情况下,mysql认为10秒才是一个慢查询.(4000W数据一个查询才会慢到10s),所以要修改慢查询的默认时间。

 1. 修改mysql的慢查询.

show variables like ‘long_query_time’ ; //可以显示当前慢查询时间
set long_query_time=1 ;//可以修改慢查询时间

[img]http://img.blog.csdn.net/20160403140507600
[img]http://img.blog.csdn.net/20160403140513318

构建大表->大表中记录有要求, 记录是不同才有用,否则测试效果和真实的相差大.

为了存储过程能够正常执行,我们需要把命令执行结束符修改

#这里我创建了一个函数. 
#rand_string(n INT) rand_string 是函数名 (n INT) //该函数接收一个整数
create function rand_string(n INT) 
returns varchar(255) #该函数会返回一个字符串
begin 
#chars_str定义一个变量 chars_str,类型是 varchar(100),默认值'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
 declare chars_str varchar(100) default
   'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
 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 $$

[img]http://img.blog.csdn.net/20160403143552877
[img]http://img.blog.csdn.net/20160403145809417
[img]http://img.blog.csdn.net/20160403150311138
[img]http://img.blog.csdn.net/20160403150317091
[img]http://img.blog.csdn.net/20160403150724594
在程序中调用函数:
<?php

$link = mysql_connect('localhost','root','123456');
if (!$link) {
    die('失败');
}

mysql_select_db('test3');

// dual 空表,哑无表
$sql = "select rand_string(6) my from dual";
//真实表情况,具体字段
/*$sql = "select rand_string(6) from salgrade";
$sql = "select rand_string(6),grade from salgrade";*/

$res = mysql_query($sql,$link);
if ($row = mysql_fetch_assoc($res)){
    echo $row['my'];
}

[img]http://img.blog.csdn.net/20160403151248127

#创建一个存储过程
#随即添加雇员[光标]  400w
#start 表示雇员的编号从哪里开始
#max_num 表示一共增加多少雇员
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0; 
#set autocommit =0 把autocommit设置成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 $$
delimiter ;
#调用刚刚写好的函数, 1800000条记录,从100001号开始
call insert_emp(100001,4000000);

[img]http://img.blog.csdn.net/20160403152942727
③   这时我们如果出现一条语句执行时间超过1秒中,就会统计到

[img]http://img.blog.csdn.net/20160403154435124
④   如果把慢查询的sql记录到我们的一个日志中
在默认情况下,我们的mysql不会记录慢查询,需要在启动mysql时候,指定记录慢查询才可以
bin\mysqld.exe - -safe-mode  - -slow-query-log [mysql5.5 可以在my.ini指定]
bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]

先关闭mysql,再启动, 如果启用了慢查询日志,默认把这个文件放在
my.ini 文件中记录的位置
#Path to the database root
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"

[img]http://img.blog.csdn.net/20160403154928610
[img]http://img.blog.csdn.net/20160403155021907
[img]http://img.blog.csdn.net/20160403161232462
[img]http://img.blog.csdn.net/20160403161238369
[img]http://img.blog.csdn.net/20160403161244634
[img]http://img.blog.csdn.net/20160403161250056

⑤   测试,可以看到在日志中就记录下我们的mysql慢sql语句.

[img]http://img.blog.csdn.net/20160403161855152
[img]http://img.blog.csdn.net/20160403161901512
......显示全文...
    点击查看全文


上一篇文章      下一篇文章      查看所有文章
2016-04-03 20:45:40  
数据库 最新文章
Python&MySQL&PyQt
最新用python来操作mysql完全解析
mongodb的安装详解
1.PDO简介
《MySQL必知必会学习笔记》:高级联结
【翻译自mos文章】怎么对Microsoft(Office)
MyCAT全局表描述及示例
ocp
关于SQL数据表存储过程表名前缀换成dbo代码
数据库调优教程(二)慢查询数据准备
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年1日历
2018-1-23 3:53:24
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --