1. 程式人生 > >SQL排查- 慢查詢日誌與分析資料庫海量資料

SQL排查- 慢查詢日誌與分析資料庫海量資料

慢查詢日誌

用於記錄MYsql種響應時間超過閾值
開啟慢日誌
show variables ‘%slow_query-log%’
臨時開啟
set global slow_query_log = 1
關閉服務
永久開啟
/etc/my.cnf [mysqlD]
修改日誌
慢查詢閾值 ,臨時設定和永久設定,改完之後重新登入後生效,不需要重啟服務
long_query_time = 3
select sleep(4)休眠4秒
show global status like ‘%slow_queries%’
檢視慢查詢日誌檔案 cat …
自帶
mysqldumpslow --help 篩選,查詢慢日誌檔案(返回資料最多,訪問次數最多,包含左外連線)

分析資料庫海量資料(a,b)

a,模擬海量資料

儲存過程(無return)、儲存函式(有return)
需求:
產生隨機數,隨機字串
randstring(6) ->adacva 模擬名稱 字串從1開始
儲存函式:

delimiter $   --防止語義報錯--結束符號
 create function randstring(n int) returns varchar(255)
 begin
      declare all_str varchar(100) default 'adadsadwfwvvwfwafafaf'
       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$

開啟了慢查詢日誌編寫儲存過程或者儲存函式就會報這個錯誤。
臨時解決和永久解決(設定引數變數和修改配置檔案)

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

–通過儲存過程插入海量資料

 create procedure insert_emp(in eid_start int(10),int data_time int(10))
begin
 declare i int default 0;
 set autocommit = 0;
repeat
  
   insert into emp values(eid_start +i,randstring(5),'other',rutn_num());
     set i = i+1;
util i = data_times
 end repeat;
end $

—呼叫儲存過程和函式實現模擬海量資料

  call insert_num()

b,分析海量資料

(1)show profiles;–預設關閉
會記錄profiling開啟後的語句全部sql執行時間 duration代表總共花費的時間

(2)–精確分析:sql診斷
show profile all for query 第幾條
all 可以替換為你希望看見的關鍵部分時間花費
例如:cpu,等
(3)全域性查詢日誌:記錄開啟之後的全部sql語句(只在調優的時候開啟)
set gloobal general_log =1
set global log_output = ‘table’

  會被記錄mysql.general_log表中
  (分析)  select * from mysql.general.log