1. 程式人生 > >MySQL優化(五) SQL 語句的優化

MySQL優化(五) SQL 語句的優化

一、索引

1、分類

(1)主鍵索引:當一張表的某個欄位設定為主鍵時,該欄位就是主鍵索引;

(2)唯一索引:索引列中的值必須是唯一的,但是允許為空值(可以存在多個null);

(3)普通索引:基本索引型別,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹為了查詢資料更快一點;

(4)全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT型別欄位上使用全文索引,介紹了要求,說說什麼是全文索引,就是在一堆文字中,通過其中的某個關鍵字等,就能找到該欄位所屬的記錄行,比如有"你真的是一個好人" 通過“一個好人”,可能就可以找到該條記錄。

  在模糊查詢中使用全文索引:select * from user where match(name) against ('zhang')  格式: match(列名, ...) against ('搜尋的關鍵字')。

  全文索引中,有一個叫做停止詞。因為在一個文字中,建立索引是一個無窮大的數,所以對一些常用詞和字元,就不會建立索引,這些詞被稱為停止詞。

2、查詢索引

show index(es) from 表名
show keys from 表名

3、為什麼建立索引之後查詢速度變快?

因為索引使用了二叉樹的資料結構,所以速度快;索引檔案會佔用磁碟空間;建立索引後進行增刪改操作就會變慢,因為要重新調整二叉樹;

 

二、索引使用的注意事項

1、在哪些列上適合新增索引?

(1)列比較頻繁的作為查詢條件,應該建立索引

(2)唯一性太差的欄位不適合單獨建立索引,即使頻繁作為查詢條件;

(3)更新非常頻繁的欄位不適合建立索引;

(4)不會出現在 WHERE 子句中欄位不該建立;

 2、索引的使用

(1)查詢要使用索引最重要的條件是查詢條件中需要使用索引;

(2)對於建立的多列索引,只要查詢條件使用了索引中最左邊的列,索引一般就會被使用;

(3)對於使用 like 的查詢,查詢如果是 '%aaa' 不會使用到索引,'aaa%' 會使用到索引。

3、不會使用索引的情況:

(1)如果條件中有 OR,即使其中有條件帶索引也不會使用;

(2)對於多列索引,不是使用的最左邊的列作為條件,則不會被使用;

(3)like 查詢以 % 開頭,不會使用索引;即在 like 查詢時,查詢的關鍵字前面不能使用% (或 _)這樣的字元,如果一定前面有變化的值,則考慮全文索引。

(4)如果列型別是字串,那一定要在條件中將資料使用引號引起來,否則不會使用索引;

(5)如果Mysql 估計使用全表掃描要比使用索引快,則不使用索引;

 

三、通過 explain 語句分析,mysql 如何執行你的 sql 語句

explain查詢sql執行計劃,各列含義:
table:表名;
type:連線的型別

    -system:表只有一行
    -const:主鍵、索引。即表最多有一個匹配;
    -eq_reg:主鍵、索引的範圍查詢;
    -ref:連線的查詢(join)
    -range:索引的範圍查詢;
    -index:索引的掃描;
    -all:全表掃描;
possible_keys:可能用到的索引;
key:實際使用的索引;
key_len:索引的長度,越短越好;
ref:索引的哪一列被使用了,常數較好;
rows:mysql認為必須檢查的用來返回請求資料的行數;
extra:using filesort、using temporary(常出現在使用order by時)時需要優化。
    -Using filesort  額外排序。看到這個的時候,查詢就需要優化了
    -Using temporary 使用了臨時表。看到這個的時候,也需要優化。