?nèi)罩鹃_(kāi)啟與 SQL 優(yōu)化實(shí)戰(zhàn)(寶塔環(huán)境))
# MySQL慢查詢(xún)?nèi)罩鹃_(kāi)啟與SQL優(yōu)化實(shí)戰(zhàn)寶塔環(huán)境網(wǎng)站訪(fǎng)問(wèn)卡頓、接口響應(yīng)超時(shí)很多時(shí)候根源在數(shù)據(jù)庫(kù)慢SQL。寶塔環(huán)境下MySQL慢查詢(xún)是日常運(yùn)維高頻排查項(xiàng)下面整理一套實(shí)操流程。## 一、開(kāi)啟慢查詢(xún)?nèi)罩具M(jìn)入寶塔數(shù)據(jù)庫(kù)配置找到my.cnf在[mysqld]段添加配置 ini slow_query_log1slow_query_log_file/www/server/mysql/log/slow.log long_query_time2log_queries_not_using_indexes0參數(shù)說(shuō)明slow_query_log1開(kāi)啟慢查詢(xún)long_query_time2執(zhí)行超過(guò) 2 秒的 SQL 記錄日志log_queries_not_using_indexes關(guān)閉則不記錄沒(méi)有走索引的 SQL避免日志爆炸修改完成后重啟 MySQL 服務(wù)生效。二、查看實(shí)時(shí)慢 SQL查看當(dāng)前正在執(zhí)行的 SQLshow processlist;如果看到大量 Sleep 或者 Query 狀態(tài)長(zhǎng)時(shí)間停留就是數(shù)據(jù)庫(kù)阻塞了。分析慢日志自帶工具mysqldumpslow-st /www/server/mysql/log/slow.log-s t 代表按照?qǐng)?zhí)行時(shí)間排序優(yōu)先看耗時(shí)最高的語(yǔ)句。三、用 EXPLAIN 分析 SQL 執(zhí)行計(jì)劃拿到慢 SQL 之后前面加上 EXPLAIN 查看執(zhí)行計(jì)劃EXPLAIN SELECT * FROMtestWHEREid1;重點(diǎn)看 type 字段ref、range 屬于正常ALL 代表全表掃描是最需要優(yōu)化的一般是缺少索引。key 字段顯示當(dāng)前 SQL 實(shí)際命中的索引。四、索引失效常見(jiàn)坑where 條件字段做函數(shù)運(yùn)算隱式類(lèi)型轉(zhuǎn)換字符串和數(shù)字對(duì)比使用 or 連接沒(méi)有同時(shí)加索引模糊查詢(xún) % 放在前面無(wú)法走索引。五、簡(jiǎn)單優(yōu)化思路給查詢(xún)條件字段建立合適索引不要 select *只查詢(xún)需要的字段大表分頁(yè)避免 limit 超大偏移頻繁查詢(xún)的數(shù)據(jù)放入 Redis 緩存減少數(shù)據(jù)庫(kù)壓力。小結(jié)數(shù)據(jù)庫(kù)慢排查順序show processlist 看實(shí)時(shí)阻塞開(kāi)啟慢查詢(xún)?nèi)罩静东@慢 SQLexplain 分析執(zhí)行計(jì)劃補(bǔ)索引、改寫(xiě) SQL、增加緩存參考資料文檔記錄lxmrj.com