[點(diǎn)晴永久免費(fèi)OA][轉(zhuǎn)帖]什么時(shí)候 MySQL 查詢會(huì)變慢?
索引創(chuàng)建的好,并不意味著查詢就一定快,影響查詢效率的因素特別多,今天我們就來(lái)聊一聊這些可能影響到查詢的因素。 1. 查詢流程開(kāi)始今天的內(nèi)容之前,先來(lái)和小伙伴們大概捋一捋 MySQL 的查詢流程。我們來(lái)看如下一張圖:
這張圖大家大概有個(gè)印象,在后續(xù)的 MySQL 查詢和優(yōu)化中,很多東西就容易理解了。 接下來(lái)我們就來(lái)看看什么情況下查詢會(huì)變慢。 2. 查詢了不需要的記錄數(shù)據(jù)按需取用。有時(shí)候我們會(huì)忽略多拿數(shù)據(jù)對(duì)查詢性能的影響,然而優(yōu)化是一個(gè)錙銖必較的事情,需要多少數(shù)據(jù)就查詢多少,要盡量避免數(shù)據(jù)庫(kù)查詢 100 條,結(jié)果前端只展示 10 條這種情況。如有需要,可以通過(guò) limit 來(lái)限制數(shù)據(jù)庫(kù)查詢出來(lái)的數(shù)據(jù)總量。
3. 返回需要的列查詢的時(shí)候盡量避免 特別是有的時(shí)候多表聯(lián)合查詢,如果用 在前面的文章中,松哥也和大家提到過(guò)覆蓋索引,如果索引設(shè)計(jì)得當(dāng),那么在查詢的時(shí)候可以通過(guò)覆蓋索引來(lái)提高查詢的性能,但是如果使用了 4. 恰到好處的緩存這里舉一個(gè) TienChin 項(xiàng)目的例子,用戶登錄成功之后,在后續(xù)的流程中,經(jīng)常會(huì)用到當(dāng)前登錄用戶的信息,如果每次都去數(shù)據(jù)庫(kù)查詢,每次查詢返回結(jié)果都是一致的,沒(méi)有必要,此時(shí)我們可以將用戶信息存入到 Redis 緩存中,需要的時(shí)候從 Redis 中提取就可以了。 在項(xiàng)目中,對(duì)于這些需要多次頻繁查詢,且每次查詢返回結(jié)果一樣的數(shù)據(jù),都可以選擇將之存入到緩存中以提高查詢性能。 5. 關(guān)注掃描行數(shù)在查詢的時(shí)候,我們可以通過(guò) explain 來(lái)查看執(zhí)行計(jì)劃,執(zhí)行計(jì)劃中有一個(gè)指標(biāo)是掃描行數(shù),如下圖中的 rows,這個(gè)就表示查詢優(yōu)化器預(yù)估要掃描多少行記錄,filtered 則表示預(yù)估滿足條件的比例。
6. 關(guān)注掃描類(lèi)型這一條實(shí)際上就是讓大家關(guān)注前面查詢計(jì)劃中的 type 字段的值,type 字段的取值有很多種,例如常見(jiàn)的 index、ALL、range、const 以及 ref,還有一些不常見(jiàn)的如 system、eq_ref、fulltext、ref_or_null、index_merge、unique_subquery、index_subquery 等,每一種都代表了不同的查詢計(jì)劃,再結(jié)合查詢計(jì)劃中的 Extra 字段中的值,我們大致上可以將查詢分為三種類(lèi)型:
該文章在 2023/7/20 14:32:23 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |