日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库高级知识——查询截取分析(一)

發(fā)布時間:2024/7/19 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库高级知识——查询截取分析(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1.慢查詢?nèi)罩?/li>
      • 1.1 慢查詢?nèi)罩臼鞘裁?/li>
      • 1.2 慢查詢?nèi)罩镜牟僮?/li>
      • 1.3 日志分析工具mysqldumpslow
    • 2.批量數(shù)據(jù)腳本

1.慢查詢?nèi)罩?/h2>

1.1 慢查詢?nèi)罩臼鞘裁?/h3> MySQL的慢查詢?nèi)罩臼荕ySQL提供的一種日志記錄,它用來記錄在MySQL中響應(yīng)時間超過閥值的語句, 具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢?nèi)罩局小>唧w指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢?nèi)罩局小?long_query_time的默認值為10,意思是運行10秒以上的語句。由他來查看哪些SQL超出了我們的最大忍耐時間值,比如一條sql執(zhí)行超過5秒鐘,我們就算慢SQL, 希望能收集超過5秒的sql,結(jié)合之前explain進行全面分析。

1.2 慢查詢?nèi)罩镜牟僮?/h3>

1.說明

Ubuntu20.04+MySQL8.0.25的配置文件 /etc/mysql /etc/mysql/mysql.conf.d默認情況下,MySQL數(shù)據(jù)庫沒有開啟慢查詢?nèi)罩?#xff0c;需要我們手動來設(shè)置這個參數(shù)。當然,如果不是調(diào)優(yōu)需要的話,一般不建議啟動該參數(shù),因為開啟慢查詢?nèi)罩緯蚨嗷蛏賻硪欢ǖ男阅苡绊憽?慢查詢?nèi)罩局С謱⑷罩居涗泴懭胛募?

2.查看是否開啟及如何開啟
查看:

mysql> SHOW VARIABLES LIKE '%slow_query_log%'; +---------------------+----------------------------------------------+ | Variable_name | Value | +---------------------+----------------------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/zhaoxr-ThinkPad-E450-slow.log | +---------------------+----------------------------------------------+ 2 rows in set (0.01 sec) 默認情況下slow_query_log的值為OFF,表示慢查詢?nèi)罩臼墙玫?#xff0c; 可以通過設(shè)置slow_query_log的值來開啟

開啟:

mysql> set global slow_query_log=1; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE '%slow_query_log%'; +---------------------+----------------------------------------------+ | Variable_name | Value | +---------------------+----------------------------------------------+ | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/zhaoxr-ThinkPad-E450-slow.log | +---------------------+----------------------------------------------+ 2 rows in set (0.01 sec) 使用set global slow_query_log=1開啟了慢查詢?nèi)罩局粚Ξ斍皵?shù)據(jù)庫生效, 如果MySQL重啟后則會失效。如果要永久生效,就必須修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnf(其它系統(tǒng)變量也是如此)修改slow_query_log 和slow_query_log_file后,然后重啟MySQL服務(wù)器。 slow_query_log =1 slow_query_log_file=/var/lib/mysql/atguigu-slow.log關(guān)于慢查詢的參數(shù)slow_query_log_file ,它指定慢查詢?nèi)罩疚募拇娣怕窂?#xff0c;系統(tǒng)默認會給一個缺省的文件host_name-slow.log(如果沒有指定參數(shù)slow_query_log_file的話)

3.那么開啟了慢查詢?nèi)罩竞?#xff0c;什么樣的SQL才會記錄到慢查詢?nèi)罩纠锩婺?#xff1f;

這個是由參數(shù)long_query_time控制,MySQL8.0.25默認情況下long_query_time的值為10秒, 查看命令: mysql> SHOW VARIABLES LIKE 'long_query_time%'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.01 sec) 可以使用命令修改,也可以在/etc/mysql/mysql.conf.d/mysqld.cnf參數(shù)里面修改。假如運行時間正好等于long_query_time的情況,并不會被記錄下來。也就是說, 在mysql源碼里是判斷大于long_query_time,而非大于等于。 查詢當前系統(tǒng)中有多少條慢查詢記錄 mysql> show global status like '%Slow_queries%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Slow_queries | 0 | +---------------+-------+ 1 row in set (0.01 sec)

1.3 日志分析工具mysqldumpslow

1.查看mysqldumpslow的幫助信息

mysqldumpslow --help

s: 是表示按照何種方式排序;
c: 訪問次數(shù)
l: 鎖定時間
r: 返回記錄
t: 查詢行數(shù)
al:平均鎖定時間
ar:平均返回記錄數(shù)
at:平均查詢時間
t:即為返回前面多少條的數(shù)據(jù);
g:后邊搭配一個正則匹配模式,大小寫不敏感的;

2.常用語法

得到返回記錄集最多的10個SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log

得到訪問次數(shù)最多的10個SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log

得到按照時間排序的前10條里面含有左連接的查詢語句
mysqldumpslow -s t -t 10 -g “l(fā)eft join” /var/lib/mysql/atguigu-slow.log

另外建議在使用這些命令時結(jié)合 | 和more 使用 ,否則有可能出現(xiàn)爆屏情況
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more

2.批量數(shù)據(jù)腳本

1.建表

# 新建庫 create database bigData; use bigData;#1 建表dept CREATE TABLE dept( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, dname VARCHAR(20) NOT NULL DEFAULT "", loc VARCHAR(13) NOT NULL DEFAULT "" ) ENGINE=INNODB DEFAULT CHARSET=UTF8 ; #2 建表emp CREATE TABLE emp ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*編號*/ ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/ job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/ mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上級編號*/ hiredate DATE NOT NULL,/*入職時間*/ sal DECIMAL(7,2) NOT NULL,/*薪水*/ comm DECIMAL(7,2) NOT NULL,/*紅利*/ deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部門編號*/ )ENGINE=INNODB DEFAULT CHARSET=UTF8 ;

2.設(shè)置參數(shù)log_bin_trust_function_creators

創(chuàng)建函數(shù),假如報錯:This function has none of DETERMINISTIC...... # 由于開啟過慢查詢?nèi)罩?#xff0c;因為我們開啟了 bin-log, 我們就必須為我們的function指定一個參數(shù)。show variables like 'log_bin_trust_function_creators';set global log_bin_trust_function_creators=1;# 這樣添加了參數(shù)以后,如果mysqld重啟,上述參數(shù)又會消失

3.創(chuàng)建函數(shù),保證每條數(shù)據(jù)都不同
隨機產(chǎn)生字符串

DELIMITER $$ CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255) BEGIN ##方法開始DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; ##聲明一個 字符竄長度為 100 的變量 chars_str ,默認值 DECLARE return_str VARCHAR(255) DEFAULT '';DECLARE i INT DEFAULT 0; ##循環(huán)開始WHILE i < n DO SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1)); ##concat 連接函數(shù) ,substring(a,index,length) 從index處開始截取SET i = i + 1;END WHILE;RETURN return_str; END $$#假如要刪除 #drop function rand_string;

隨機產(chǎn)生部門編號

#用于隨機產(chǎn)生部門編號 DELIMITER $$ CREATE FUNCTION rand_num( ) RETURNS INT(5) BEGIN DECLARE i INT DEFAULT 0; SET i = FLOOR(100+RAND()*10); RETURN i; END $$#假如要刪除 #drop function rand_num;

4.創(chuàng)建存儲過程
創(chuàng)建往emp表中插入數(shù)據(jù)的存儲過程

DELIMITER $$ CREATE PROCEDURE insert_emp10000(IN START INT(10),IN max_num INT(10)) BEGIN DECLARE i INT DEFAULT 0; #set autocommit =0 把autocommit設(shè)置成0 ;提高執(zhí)行效率SET autocommit = 0; REPEAT ##重復(fù)SET i = i + 1; INSERT INTO emp10000 (empno, ename ,job ,mgr ,hiredate ,sal ,comm ,deptno ) VALUES ((START+i) ,rand_string(6),'SALESMAN',0001,CURDATE(),FLOOR(1+RAND()*20000),FLOOR(1+RAND()*1000),rand_num()); UNTIL i = max_num ##直到 上面也是一個循環(huán)END REPEAT; ##滿足條件后結(jié)束循環(huán)COMMIT; ##執(zhí)行完成后一起提交END $$#刪除 # DELIMITER ; # drop PROCEDURE insert_emp;

創(chuàng)建往dept表中插入數(shù)據(jù)的存儲過程

#執(zhí)行存儲過程,往dept表添加隨機數(shù)據(jù) DELIMITER $$ CREATE PROCEDURE insert_dept(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 dept (deptno ,dname,loc ) VALUES (START +i ,rand_string(10),rand_string(8)); UNTIL i = max_num END REPEAT; COMMIT; END $$ #刪除 # DELIMITER ; # drop PROCEDURE insert_dept;

5.調(diào)用存儲過程
dept

DELIMITER ; CALL insert_dept(100,10);

emp

#執(zhí)行存儲過程,往emp表添加50萬條數(shù)據(jù) DELIMITER ; #將 結(jié)束標志換回 ; CALL insert_emp(100001,500000); CALL insert_emp10000(100001,10000);

總結(jié)

以上是生活随笔為你收集整理的数据库高级知识——查询截取分析(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。