這篇文章中我以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,能用值類型就用值類型