mysql 全表掃瞄 mysql的全表掃瞄

2021-10-17 12:38:45 字數 1368 閱讀 4270

在mysql查詢中,如果表沒有索引的話,當查詢執行時,需要從第一行資料到最後一行資料進行全表掃瞄。索引的目的就是輔助查詢能快速定位到目標資料,然後獲取查詢結果。那麼表是否有了索引就一定能加以應用,而不會進行全表掃面了呢?現實肯定不是這樣的!!!

1 全表掃瞄的場景

使用explain分析sql時,當列出執行計畫表中type字段值為all時,代表需要全表掃瞄,全表掃瞄常會發生在以下場景中。

1> 所掃瞄的資料表非常小,因此全表掃瞄的速度要遠快於使用索引,在小於10行或行資料比較短的表中更常見。

2> 在on或where子句中沒有可以使用的索引列。

3> 在使用索引列與常量值比較,並且mysql服務已經通過索引樹計算出常量值覆蓋了大部分表資料,此時使用全表掃瞄是比較快的。

4> 當前正在使用乙個對於其他列來說基數較低的索引(每個索引值在另一列都有多行行對應),在這種情況下,使用索引可能會引起較多的索引查詢,mysql認為全表掃瞄比較快。

2 避免全表掃瞄

對於小表而言,全表掃瞄因為對效能影響可以忽略所以該方式是最合適的,但是對於大表而言,使用以下操作可以幫助優化器對於是否進行全表掃瞄做出正確的判斷:

1> 使用analyze table tbl_name語句來更新被掃瞄表中索引的分布。

2> 對被掃瞄表使用force index語句來強制優化器對該錶放棄全表掃瞄而使用索引,如下:

3> 設定啟動引數--max-seeks-for-key=1000或使用引數set max_seeks_for_key=1000來通知優化器如果沒有索引掃瞄會導致過千的索引查詢。

3 總結

對於效能開銷忽略不計的小表全表掃瞄我們可以不予重視,但是對於其他情況多是索引設計不合理或應用不合理造成的。

許多資料庫使用人員在遇到sql執行效能不行時,就會狂加一片索引,殊不知,索引帶來的便利性不是依賴於索引個數的,其本質是索引是否正確高效的在應用中發揮作用。對於現實應用中我們新增索引時常常需要考慮多個場景:

1> 該列是否在應用為唯一索引,如果不為唯一索引,重複值的出現概率為多少,如果重複值出現多,是否可以與其他列一起組合成為聯合索引而降低其重複率;

2> 多個單獨應用可能建立了多個索引,對於較大表而言,索引的大小與索引的維護也會對資料庫效能產生重大影響,此時應該考慮是否能夠將應用合併或根據應用特點將索引合併;

3> 表的操作中在insert、update和delete等涉及資料變化的操作中,也會設計到索引的維護。對於表內無效資料定時移除並備份,無效或低效索引的刪除也會提高相關sql語句的效能。

mysql全表掃瞄 mysql 全表掃瞄場景

全表掃瞄是資料庫搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。通常在資料庫中,對無索引的表進行查詢一般稱為全表掃瞄 然而有時候我們即便新增了索引,但當我們的sql語句寫的不合理的時候也會造成全表掃瞄。以下是經常會造成全表掃瞄的sql語句及應對措施 1.使用null做為判斷條件 如 s...

Mysql全表掃瞄

一,全表掃瞄是什麼?全表掃瞄,就是一條一條記錄的遍歷,直到表中的最後一條記錄。在資料庫中,對無索引的表進行查詢一般稱為全表掃瞄。全表掃瞄是資料庫伺服器用來搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。在使用explain分析sql時,當列出執行計畫表中type字段值為all時,代表需...

mysql 避免全表 mysql避免全表掃瞄

我們在寫資料庫查詢語句的時候,經常會忽略一些查詢效能問題,導致最後在查詢資料的情況下非常耗時,影響專案質量。資料庫的設計是一門藝術,需要遵循一定的規範。對資料量很大的表一定要建立合適的索引,無論是單個索引還是復合索引,要根據查詢的業務邏輯去建立,同時也記住,單個表的索參數量不得超過5個,不然會很導致...