一,全表掃瞄是什麼?
全表掃瞄,就是一條一條記錄的遍歷,直到表中的最後一條記錄。
在資料庫中,對無索引的表進行查詢一般稱為全表掃瞄。全表掃瞄是資料庫伺服器用來搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。
在使用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個,不然會很導致...