Mysql 優化之海量數據分析

現在的信息時代,有大量的數據需要被查詢並分析。這裏所指的海量數據是至少幾百萬條甚至上千條的是數據返回。基於Mysql 這類的關係型數據庫,查詢還可能還涉及多表連查,性能可想而知,要想進行優化,就必須要對網絡傳輸、數據服務器處理時間、CPU性能、索引效率等多方面因素進行一定的分析。從而才能得到真正耗時的癥結所在,合理的對症下藥,優化Mysql的查詢性能。

上一次講到通過跨列查詢導致索引失效,來學習 explain 各個參數。今天是通過存儲過程模擬海量數據,來了解profile 對分析海量數據的意義。

1,創建兩個表,分別爲部門表和員工表

create table dept
(
 	dno int(5) primary key default 0,
 	dname varchar(20) not null default '',
 	loc varchar(30) default ''
 ) ENGINE = INNODB default charset=utf8
 create table emp
 (
 	eid int(5) primary key,
	ename varchar(20) not null default '',
	job varchar(20) not null default '',
	deptno int(5) not null default 0
 ) ENGINE = INNODB DEFAULT charset = utf8

2,通過存儲函數插入海量數據
2.1創建存儲函數:randstring(6) -> dsjdjA 用於模擬員工名稱(隨機字符串)

 delimiter $
 create function randstring(n int) returns varchar(255)
 begin 
	 declare all_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(all_str, FLOOR(1+RAND()*52), 1) );
 		set i=i+1;
 	end while;
 	return return_str;
 end $

2.2 產生隨機整數的存儲函數

 delimiter $
 create function ran_num() returns int(5)
 begin 
	 declare i int default 0;
 	 set i = floor(rand() * 100);
	 return i;
 end $

2.3通過存儲過程插入海量數據:emp 表中

create procedure insert_emp(in eid_start int(10), in data_times int(10))
begin
	declare i int default 0;
	set autocommit = 0; --關閉自動提交
	repeat
		insert into emp values(eid_start+ i, randstring(5), 'other' ran_num());
		set i = i+1;
	until i = data_time
	end repeat;
commit;
end $

dept 表中

create procedure insert_dept(in dno_start int(10) , in datatimes int(10))
begin 
	declare i int default 0;
	set autocommit = 0;
 	repeat
  		insert into dept values(dno_start +i, randstring(6), randstring(8));
  		set i = i+1;
  		until i = data_times
 	end repeat;
commit; 
end$

執行兩個表的插入操作

call insert_emp(1000, 800000);
call insert_dept(10, 30);

3,分析海量數據: profiles

show profile;--默認關閉
show variables like '%profiling%';
set profiling = on -- 再查看是否打開
show profiles;--會記錄所有profiling打開之後的,全部SQL查詢語句所花費的時間。缺點:不夠精確,只能看到總的時間。
--精確診斷:sql診斷
show profile all for query 1;查看指定query_id的sql的執行消耗情況
show profile cpu,block io for query 2; 

結果參照下圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章