SQL優化的解決方案

這篇文章中我以MySQL做示例

首先我跟大家介紹一下explain,這個關鍵字可以查看sql的執行計劃,具體字段如下:

在這裏插入圖片描述
該type列 EXPLAIN輸出介紹如何連接表。在JSON格式的輸出中,這些作爲access_type屬性的值找到。以下列表描述了連接類型,從最佳類型到最差類型:
system > const > eq_ref > ref > range > index > all

  • system
    該表只有一行(=系統表)。這是const聯接類型的特例 。

  • const
    該表最多具有一個匹配行,該行在查詢開始時讀取。因爲只有一行,所以優化器的其餘部分可以將這一行中列的值視爲常量。 const表非常快,因爲它們只能讀取一次。

  • eq_ref
    對於先前表中的每行組合,從此表中讀取一行。除了 system和 const類型,這是最好的連接類型。當連接使用索引的所有部分並且索引爲PRIMARY KEY或UNIQUE NOT NULLindex時使用。

  • ref
    對於先前表中的每個行組合,將從該表中讀取具有匹配索引值的所有行。

  • range。使用索引查詢行,僅檢索給定範圍內的行。如 where key=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE,或 IN()

  • index。對索引樹進行全部掃描

  • ALL。對來查詢的表進行全表掃描。

以下是一個示例,我們要儘量避免出現下例情況
在這裏插入圖片描述

這裏記錄一下常用到的SQL優化

1.sql優化我們記一件事就是儘量避免使用全表掃描,如上圖

2.我們在查詢時經常使用的where的字段一定要加索引

select * from table where number=1

這裏的number如果使用次數多就加一個索引

3.在查詢時儘量不要使用 in 如果是連續值請用between

不要使用這種 select * from table1 where  number in(1,2,3);
使用這種 select * from table1 where number BETWEEN 1 and 3;

4.查詢的時候不要在where後面加表達式

不要用 select * from table1 where  number/2 =1;
使用 select * from table1 where number =1*2;

5.查詢的時候不要用select * ,用到哪個字段查哪個

不要使用 select * from table;
使用 select number from table;

注:這篇文章都是用select * 作爲例子而已,如 3、4、5

6.不要用where 1=1,字符串拼接的時候去判斷

不要使用 select * from table where 1=1 and number=1;
使用 select * from table number=1;

7.查詢用到 like的時候,不要把%放前面,就是說最好已知字符串開頭用字符串的開頭去匹配後面的字段,有索引的情況下‘%張’查詢時間 是 ‘張%’查詢時間的幾何倍數,比如幾十幾百倍

不用 select * from table name like '%張%'
可以用
select * from table name like ‘張%’

8.不要頻繁創建刪除臨時表,這樣挺消耗系統資源的

9.數據量大的話建表時不要建索引,等所有數據入庫後建索引

10.建表字段一定要合理,不用默認值爲null,能用值類型就用值類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章