造成mysql全表掃瞄的原因

2021-08-01 23:27:38 字數 1779 閱讀 7662

全表掃瞄是資料庫搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。通常在資料庫中,對無索引的表進行查詢一般稱為全表掃瞄;然而有時候我們即便新增了索引,但當我們的sql語句寫的不合理的時候也會造成全表掃瞄。

以下是經常會造成全表掃瞄的sql語句及應對措施:

1. 使用null做為判斷條件

如:select account from member where nickname = null;

建議在設計欄位時盡量將字段的預設值設為0,改為select account where nickname = 0;

2. 左模糊查詢like %***%

如:select account from member where nickname like 『%***%』 或者 select account from member where nickname like 『%***』

建議使用select account from member where nickname like 『***%』,如果必須要用到做查詢,需要評估對當前表全表掃瞄造成的後果; 劉加東@酷聽說

3. 使用or做為連線條件

如:select account from member where id = 1 or id = 2;

建議使用union all,改為 select account from member where id = 1 union all select account from member where id = 2;

4. 使用in時(not in)

如:select account from member where id in (1,2,3)

如果是連續資料,可以改為select account where id between 1 and 3;當資料較少時也可以參考union用法;

或者:select account from member where id in (select accountid from department where id = 3 ),可以改為select account from member where id exsits (select accountid from department where id = 3)

not in 可以對應 not exists;

5.使用not in時

如select account where id not in (1,2,3)

6.使用!=或<>時

建議使用 <,<=,=,>,>=,between等;

7.對字段有操作時也會引起權標索引

如select account where salary * 0.8 = 1000 或者 select account where sustring(nickname,1,3) = 『zhangxiaolong』;

8.使用count(*)時

如select count(*) from member;

建議使用select count(1) from member;

9.使用引數做為查詢條件時

如select account from member where nickname = @name

由於sql語句在編譯執行時並不確定引數,這將無法通過索引進行資料查詢,所以盡量避免; 劉加東@酷聽說

當不規範的寫法造成全表掃瞄時,會造成cpu和記憶體的額外消耗,甚至會導致伺服器崩潰。在團隊協作中難免會遇到一些初學者,除了安排合理的任務外,資深的工程師也要做好code review。否則當我們有海量資料時,不規範的語句會帶來很嚴重的後果,一定要慎重、慎重。

mysql全表掃瞄的原因

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

mysql 全表掃瞄 mysql的全表掃瞄

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

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

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