Mysql全表掃瞄

2021-10-24 04:25:07 字數 3311 閱讀 5211

一,全表掃瞄是什麼?

全表掃瞄,就是一條一條記錄的遍歷,直到表中的最後一條記錄。

在資料庫中,對無索引的表進行查詢一般稱為全表掃瞄。全表掃瞄是資料庫伺服器用來搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。

在使用explain分析sql時,當列出執行計畫表中type字段值為all時,代表需要全表掃瞄。

二,什麼情況會進行全表掃瞄?

–1)條件中使用了null

–2)使用or作為連線條件

–3)使用[not] in時

–4)使用模糊查詢時

–5)使用!=或者<>時

–6)使用count(*)時

–7)使用引數作為條件時

–8)索引使用不當時

–9)左模糊查詢:like 『%***』

三,如何避免全表掃瞄?

1.新增索引列。

正確新增索引列應該注意以下場景:

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

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

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

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

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

四,語法

explain +查詢語句

例:explain select * from mdhdb_api_account

五,解釋像這個例子的話 他查出來 則會是 如下:

我們可以看到 他的表頭有 :

id , select_type , table , type , possible_keys , key , key_len, ref , rows , extra

下面 來乙個乙個解釋意思

(1).id表示在這條查詢語句中子句被執行的順序,

1.當id相同時,執行順序是由上至下。

例:

(2).select_type 表示查詢語句中子句的型別

1.******

簡單的select語句(不包括union操作或子查詢操作)

例:select * from  mdhdb_warehouse_order
2 primary/union

primary:查詢中最外層的select(如兩表做union或者存在子查詢的外層的表操作為primary,內層的操作為union)

union:聯合查詢操作語句

dependent union:union操作中,查詢中處於內層的select(內層的select語句與外層的select語句有依賴關係)

union result:union操作的結果,id值通常為null

例:explain select * from  mdhdb_warehouse_order

subquery:子查詢中首個select(如果有多個子查詢存在)

dependent subquery:子查詢中首個select,但依賴於外層的表(如果有多個子查詢存在)

重點解釋 子查詢的查詢方式依賴於外面的查詢結果.用這個例子就是,先進行子查詢外部的查詢,得到乙個結果集,.然後這個結果的每一行在跟select子查詢的結果集進行匹配,也就是說,外部結果集的每一行都要關聯內部結果集一次

5.derived/materialized

derived:被驅動的select子查詢(子查詢位於from子句)

例:explain select * from  (select create_date from mdhdb_warehouse_order_item) a

materialized:被物化的子查詢

例:explain select * from  mdhdb_warehouse_order

uncacheable subquery:對於外層的主表,子查詢不可被物化,每次都需要計算(耗時操作)

uncacheable union:union操作中,內層的不可被物化的子查詢(類似於uncacheable subquery)

mysql 全表掃瞄 mysql的全表掃瞄

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

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

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

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

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