mysql開啟慢查詢(EXPLAIN SQL語句使用介紹)
今天,數(shù)據(jù)庫的操作越來越成為整個(gè)應(yīng)用的性能瓶頸了,這點(diǎn)對于Web應(yīng)用尤其明顯。關(guān)于數(shù)據(jù)庫的性能,這并不只是DBA才需要擔(dān)心的事,而這更是我們程序員需要去關(guān)注的事情。當(dāng)我們?nèi)ピO(shè)計(jì)數(shù)據(jù)庫表結(jié)構(gòu),對操作數(shù)據(jù)庫時(shí)(尤其是查表時(shí)的SQL語句),我們都需要注意數(shù)據(jù)操作的性能。
1、開啟慢查詢
1> 查看慢查詢是否開啟
show variables like "%quer%"; slow_query_log = ON #已開啟
2> 開啟方法:my.cnf目錄配置
slow_query_log=on #是否開啟 slow_query_log_file=/opt/MySQL_Data/TEST1-slow.log #慢查詢文件位置 long_query_time=2 #查詢超過多少秒才記錄
2、EXPLAIN慢查詢?nèi)罩纠锍霈F(xiàn)的SELECT查詢
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | user | NULL | ref | user | user | 768 | const | 1 | 100.00 | NULL |
explain列的解釋
-
table:顯示這一行的數(shù)據(jù)是關(guān)于哪張表的
-
type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、index、all
-
possible_keys:顯示可能應(yīng)用在這張表中的索引。如果為空,沒有可能的索引。可以為相關(guān)的域從where語句中選擇一個(gè)合適的語句
-
key: 實(shí)際使用的索引。如果為null,則沒有使用索引。很少的情況下,mysql會選擇優(yōu)化不足的索引。這種情況下,可以在select語句中使用use index(indexname)來強(qiáng)制使用一個(gè)索引或者用ignore index(indexname)來強(qiáng)制mysql忽略索引
-
key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好
-
ref:顯示索引的哪一列被使用了,如果可能的話,是一個(gè)常數(shù)
-
rows:mysql認(rèn)為必須檢查的用來返回請求數(shù)據(jù)的行數(shù)
-
extra:關(guān)于mysql如何解析查詢的額外信息。例子:using temporary和using filesort,意思mysql根本不能使用索引,結(jié)果是檢索會很慢
key_len的計(jì)算
-
所有的索引字段,如果沒有設(shè)置not null,則需要加一個(gè)字節(jié)。
-
定長字段,int占四個(gè)字節(jié)、date占三個(gè)字節(jié)、char(n)占n個(gè)字符。
-
對于變成字段varchar(n),則有n個(gè)字符+兩個(gè)字節(jié)。
-
不同的字符集,一個(gè)字符占用的字節(jié)數(shù)不同。latin1編碼的,一個(gè)字符占用一個(gè)字節(jié),gbk編碼的,一個(gè)字符占用兩個(gè)字節(jié),utf8編碼的,一個(gè)字符占用三個(gè)字節(jié)。
3、建索引的幾大原則
-
最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調(diào)整。
-
=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優(yōu)化器會幫你優(yōu)化成索引可以識別的形式。
-
盡量選擇區(qū)分度高的列作為索引,區(qū)分度的公式是count(distinct column)/count(*),表示字段不重復(fù)的比例,比例越大我們掃描的記錄數(shù)越少,唯一鍵的區(qū)分度是1,而一些狀態(tài)、性別字段可能在大數(shù)據(jù)面前區(qū)分度就是0,那可能有人會問,這個(gè)比例有什么經(jīng)驗(yàn)值嗎?使用場景不同,這個(gè)值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃描10條記錄。
-
索引列不能參與計(jì)算和函數(shù)的使用,保持列干凈。
-
盡量的擴(kuò)展索引,不要新建索引。比如表中已經(jīng)有a的索引,現(xiàn)在要加(a,b)的索引,那么只需要修改原來的索引即可。
相關(guān)文章
mysql默認(rèn)編碼為UTF-8 通過修改my.ini實(shí)現(xiàn)方法
這篇文章主要介紹了mysql默認(rèn)編碼為UTF-8 通過修改my.ini實(shí)現(xiàn)方法的相關(guān)資料,為了防止出現(xiàn)亂碼,Latin1是不支持漢字的,所以要將其改為UTF-8或GBK,需要的朋友可以參考下2017-01-012022最新版MySQL 8.0.30 安裝及配置教程(小白入門)
這篇文章主要介紹了2022最新版MySQL 8.0.30 安裝及配置教程,安裝過程算是比較簡單的,今天給大家分享的此文比較適合mysql數(shù)據(jù)庫的小白,需要的朋友可以參考下2022-09-09MySQL導(dǎo)入導(dǎo)出.sql文件及常用命令小結(jié)
在MySQL Qurey Brower中直接導(dǎo)入*.sql腳本,是不能一次執(zhí)行多條sql命令的,下面為大家介紹下MySQL導(dǎo)入導(dǎo)出.sql文件及常用命令2014-08-08docker 部署mysql詳細(xì)過程(docker部署常見應(yīng)用)
這篇文章主要介紹了docker 部署mysql之docker部署常見應(yīng)用,本文以docker部署mysql5.7.26為例,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08解決mysql登錄錯誤:''Access denied for user ''root''@''localhost''
這篇文章主要介紹了mysql登錄錯誤:'Access denied for user 'root'@'localhost',本文給出了操作過程及注意事項(xiàng),需要的朋友可以參考下2019-11-11