現在的信息時代,有大量的數據需要被查詢並分析。這裏所指的海量數據是至少幾百萬條甚至上千條的是數據返回。基於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;
結果參照下圖: