sql優(yōu)化

簡(jiǎn)述

MySQL慢查詢(xún),又叫慢查詢(xún)?nèi)罩?,是MySQL提供的一種日志記錄,用來(lái)記錄在MySQL中響應(yīng)時(shí)間超過(guò)閥值的語(yǔ)句。可以設(shè)置long_query_time的值,運(yùn)行時(shí)間超過(guò)long_query_time值的SQL語(yǔ)句,就會(huì)被記錄到慢查詢(xún)?nèi)罩局?,默認(rèn)為10秒。
注意:Mysql默認(rèn)不開(kāi)啟慢查詢(xún)?nèi)罩荆枰謩?dòng)來(lái)設(shè)置開(kāi)啟,不過(guò)如果沒(méi)有數(shù)據(jù)庫(kù)調(diào)優(yōu)的需要,一般是不開(kāi)啟的,因?yàn)槁樵?xún)?nèi)罩緯?huì)帶來(lái)一定的性能影響。

操作

1、是否開(kāi)啟慢查詢(xún)?nèi)罩荆?表示開(kāi)啟,0表示關(guān)閉。
使用set global slow_query_log=1開(kāi)啟了慢查詢(xún)?nèi)罩局粚?duì)當(dāng)前數(shù)據(jù)庫(kù)生效,MySQL重啟后則會(huì)失效。如果要永久生效,就必須修改配置文件my.cnf。

show variables  like '%slow_query_log%';
slow_query_log

2、slow_query_log_file這個(gè)參數(shù)用于指定慢查詢(xún)?nèi)罩镜拇娣怕窂剑笔閔ost_name-slow.log文件。

show variables like 'slow_query_log_file';
slow_query_log_file

3、long_query_time
開(kāi)啟了慢查詢(xún)?nèi)罩竞?,默認(rèn)情況下long_query_time的值為10秒,可以使用命令修改,也可以在my.cnf參數(shù)里面修改。運(yùn)行時(shí)間正好等于long_query_time的情況,并不會(huì)被記錄下來(lái)。
注意:使用命令 set global long_query_time=4修改后,需要重新連接或新開(kāi)一個(gè)會(huì)話(huà)才能看到修改值。

show variables like 'long_query_time%';
//設(shè)置
set global long_query_time=4;
set global long_query_time

4、log_output參數(shù)指定日志的存儲(chǔ)方式。log_output=‘FILE’表示將日志存入文件,默認(rèn)值也是’FILE’。日志記錄到系統(tǒng)的專(zhuān)用日志表中,要比記錄到文件耗費(fèi)更多的系統(tǒng)資源。

show variables like '%log_output%';
//設(shè)置
set global log_output='TABLE';
log_output

5、log-queries-not-using-indexes
該系統(tǒng)變量指定未使用索引的查詢(xún)也被記錄到慢查詢(xún)?nèi)罩局小?/p>

show variables like 'log_queries_not_using_indexes';
//設(shè)置
set global log_queries_not_using_indexes=1;
log-queries-not-using-indexes

6、log_slow_admin_statements
這個(gè)系統(tǒng)變量表示,是否將慢管理語(yǔ)句例如ANALYZE TABLE和ALTER TABLE等記入慢查詢(xún)?nèi)罩尽?/p>

show variables like 'log_slow_admin_statements';

7、Slow_queries
查詢(xún)有多少條慢查詢(xún)記錄。

show global status like '%Slow_queries%';

8、mysqldumpslow工具
MySQL提供了日志分析工具mysqldumpslow,用來(lái)幫助分析慢查詢(xún)?nèi)罩尽?/p>

優(yōu)化原則

基本寫(xiě)法的優(yōu)化
1、少使用select * ,盡量使用具體字段;
2、對(duì)于條件來(lái)說(shuō),等號(hào)之類(lèi) 兩邊的字段類(lèi)型要一致,字符串不加單引號(hào) 索引會(huì)失效;
3、盡量少使用order by排序,對(duì)于需要多個(gè)字段進(jìn)行排序的,可以使用組合索引
4、對(duì)于group by語(yǔ)句,要先過(guò)濾后再分組;
5、在查詢(xún)時(shí)減少使用null,對(duì)字段有多個(gè)null的可以加默認(rèn)值;
6、少使用like,對(duì)于需要使用的,盡量使用 like abc%這種,不要把%放在前面;
7、在where后面少使用函數(shù)或者算數(shù)運(yùn)算;
8、去除的distinct過(guò)濾字段要少,避免distinct * ;
9、不要超過(guò)5個(gè)以上的表連接;

建立使用合適索引
1、對(duì)于高頻篩選字段 可以適當(dāng)?shù)慕⑺饕?br> 2、一個(gè)表的索引最好不要超過(guò)5個(gè),多了會(huì)影響insert或update;
3、不要對(duì)值是有限重復(fù)的字段建立索引,例如性別等;
4、使用組合索引一定要遵循最左原則;

替代優(yōu)化
1、不要使用not in 和 <>,這個(gè)會(huì)破壞索引,not in 可以用not exists來(lái)代替,<>可以分成兩個(gè)條件 > 或者 <
2、使用連接(join)來(lái)代替子查詢(xún)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容