1、服務(wù)器層面:參數(shù)配置優(yōu)化汗唱、減少客戶端使用連接數(shù) --可考慮使用緩存
2靴跛、架構(gòu)層面:”讀寫分離、分庫渡嚣、分表、分片
3肥印、業(yè)務(wù)sql層面:查看慢查詢?nèi)罩臼兑ql優(yōu)化
show variables like '%slow_query%'; ---默認(rèn)關(guān)閉
show variables like '%long_query%'; ---多長時(shí)間是慢查詢呢?
怎么修改默認(rèn)配置深碱?
vim /etc/my.cnf
查看最慢的10條sql日志?
mysql -u root -p?
show full processlist; ---查看客戶端鏈接
show?global?status;---查看服務(wù)端狀態(tài)值
show engine?innodb? status;--?查看innodb狀態(tài)
explain執(zhí)行順序怎么看?
總節(jié):id查詢順序功咒,先從大到小,再從上到下绞蹦。調(diào)整表順序力奋,可得到不同id執(zhí)行順序。優(yōu)化原則幽七,小表驅(qū)動大表景殷,即小表放前面
一、具體案例
我們來執(zhí)行一條非常簡單的代碼:
expain select * from t1,t2,t3 where t1.id=t2.id and t2.id=t2.id;
執(zhí)行之后的結(jié)果如下:
發(fā)現(xiàn)出來了很多的字段,這么多字段其實(shí)也沒必要每個(gè)都重點(diǎn)關(guān)注猿挚,上面圖片用紅色框框標(biāo)出了5個(gè)字段咐旧,這些是需要重點(diǎn)關(guān)注的。下面具體來說說這5個(gè)字段的含義绩蜻。
1.type
表示訪問表的方式铣墨,一共有6種。
從最好到最差的結(jié)果依次如下:
system > const > eq_ref > ref > range > index > ALL
注意:一個(gè)好的SQL語句至少要達(dá)到range級別办绝!杜絕出現(xiàn)all級別伊约。
system: 表示結(jié)果集僅有一行;
const: 表示通過主鍵或者唯一鍵鍵查找數(shù)據(jù)時(shí)只匹配最多一行數(shù)據(jù)八秃;
eq_ref: 該類型多出現(xiàn)在多表join場景碱妆,通過主鍵或者唯一鍵訪問表;
對于前表b的每行記錄昔驱,都只能匹配到后表a的一行記錄并且查詢的比較操作通常是=疹尾,查詢效率較高。
ref: 此類型通常出現(xiàn)在sql使用非唯一或非主鍵索引骤肛, 或者是使用最左前綴規(guī)則索引的查詢纳本;
range: 表示where條件使用索引范圍查詢,當(dāng) type 是 range 時(shí),ref 字段為 NULL腋颠。
index: 表示全索引掃描繁成, 掃描所有的索引記錄, 而不掃描數(shù)據(jù);
index 類型通常會出現(xiàn)在覆蓋索引中,所要查詢的數(shù)據(jù)直接在索引中就可以訪問淑玫, 而不用回表掃描數(shù)據(jù). 此時(shí)Extra 字段 會顯示 Using index巾腕。
還有一種是全表掃描時(shí)通過索引順序訪問數(shù)據(jù)。此時(shí)并不會在Extra提示 using index絮蒿。
ALL: 表示執(zhí)行計(jì)劃選擇全表掃描尊搬,當(dāng)執(zhí)行計(jì)劃出現(xiàn)type 為all 時(shí),我們盡量通過修改索引的方式讓查詢利用索引土涝。
2.key
此字段是 MySQL 在當(dāng)前查詢時(shí)所真正使用到的索引佛寿。
如果沒有選擇索引,值是NULL但壮。
可以采取強(qiáng)制索引方式冀泻。
3.key_len
key_len表示執(zhí)行計(jì)劃所選擇的索引長度有多少字節(jié),通常我們可借此判斷聯(lián)合索引有多少列蜡饵。
key_len 大小的計(jì)算規(guī)則是:
一般地弹渔,key_len 等于索引列類型字節(jié)長度,例如int類型為4 bytes溯祸,bigint為8 bytes捞附;
如果是字符串類型巾乳,還需要同時(shí)考慮字符集因素,例如:CHAR(30) UTF8則key_len至少是90 bytes鸟召;
若該列類型定義時(shí)允許NULL胆绊,其key_len還需要再加 1 bytes;
若該列類型為變長類型欧募,例如 VARCHAR(TEXT\BLOB不允許整列創(chuàng)建索引压状,如果創(chuàng)建部分索引也被視為動態(tài)列類型),其key_len還需要再加 2 bytes跟继。
4.rows
表示的是掃描行數(shù)种冬。
記住:該值是個(gè)預(yù)估值舔糖,所以并非是完全準(zhǔn)確的值娱两。
MySQL 查詢優(yōu)化器根據(jù)統(tǒng)計(jì)信息,估算 SQL 要查找到結(jié)果集需要掃描讀取的數(shù)據(jù)行數(shù)金吗。
原則上 rows 越少越好十兢。
5.extra
該列會提示優(yōu)化執(zhí)行計(jì)劃的額外的信息。
注意摇庙,常見的不太友好的旱物、值得大家關(guān)注的有如下幾種:
Using index。表示該sql利用覆蓋索引掃描卫袒,也即從只訪問索引即可獲取到所需的數(shù)據(jù)宵呛,而不用回表。
Using where夕凝。表示該sql 回表獲取數(shù)據(jù)了宝穗。什么是回表呢? 其實(shí)就是僅僅通過訪問索引不能滿足獲取所需的數(shù)據(jù)码秉,需要訪問表的page 頁逮矛。
如果和Using index 同時(shí)出現(xiàn),說明where條件通過索引定位數(shù)據(jù)泡徙,然后回表,再過濾所需要的數(shù)據(jù)膜蠢。
Using filesort堪藐。說明排序沒有利用索引而發(fā)生了額外排序 ,伴隨著的可能還有Using temporary挑围。
其實(shí)還有其它一些 提示Using MRR、Using index condition 杉辙、Using index for group-by,這些提示是正向的综看,說明sql比較優(yōu)化红碑。
6.其它字段
前面講了5個(gè)比較重要的字段析珊,相信很多求知欲強(qiáng)的小伙伴也想知道其它字段是什么意思忠寻,這里也一并列出來奕剃,以供參考:
字段含義
id查詢語句的序號或者說是標(biāo)識符
select_type表示查詢的類型哑姚,常見的有如下6種
table其值為表名或者表的別名叙量,表示訪問哪一個(gè)表
partitions匹配的分區(qū)
possible_keys表示查詢時(shí)绞佩,可能使用的索引
filtered按表?xiàng)l件過濾的行百分比?越高越好品山,越高表示返回給server層數(shù)據(jù)越準(zhǔn)確肘交,100表示server層無需再過濾涯呻,減少性能消耗
explain format=json select * from schn_shop_goods order by goods_id;---加上format=json?可得到更詳細(xì)信息入cost成本數(shù)據(jù)等
常見優(yōu)化
-----后續(xù)具體案例再添加
https://www.mysqlzh.com/doc/64.html---mysql中文參考文檔
https://dev.mysql.com/doc/refman/5.7/en/? ---mysql官網(wǎng)