查詢優化
-
查詢兩大原則mysql
最新出現的條件,必定是過濾和排除更多結果的條件;第二齣現的次之;以此類推。
ORDER BY中的條件,只與索引有關,與條件順序無關。sql
在大多數狀況下,根據WHERE條件的前後順序和ORDER BY的排序字段的前後順序的創建的聯合索引,就是這條SQL語句匹配的最優索引結構。數組
2.EXPLAIN 語句
此語句能夠檢測索引和查詢可否良好匹配的簡單方法
>EXPLAIN SELECT * FROM TABLE WHERE ID>0 AND USERNAME='ABC' ORDER BY C;服務器
table 表示查詢的表
type表示鏈接類型函數
- 常見類型以下: ALL, index, range, ref, eq_ref, const, system, NULL
從左到右,性能從最差到最好
- ALL:Full Table Scan, MySQL將遍歷全表以找到匹配的行
- index:Full Index Scan,index與ALL區別爲index類型只遍歷索引樹
- range:索引範圍掃描,對索引的掃描開始於某一點,返回匹配值域的行。顯而易見的索引範圍掃描是帶有between或者where子句裏帶有<, >查詢。當mysql使用索引去查找一系列值時,例如IN()和OR列表,也會顯示range(範圍掃描),固然性能上面是有差別的。
- ref:使用非惟一索引掃描或者惟一索引的前綴掃描,返回匹配某個單獨值的記錄行
- eq_ref:相似ref,區別就在使用的索引是惟一索引,對於每一個索引鍵值,表中只有一條記錄匹配,簡單來講,就是多表鏈接中使用primary key或者 unique key做爲關聯條件、
- const、system:當MySQL對查詢某部分進行優化,並轉換爲一個常量時,使用這些類型訪問。如將主鍵置於where列表中,MySQL就能將該查詢轉換爲一個常量
- NULL:MySQL在優化過程當中分解語句,執行時甚至不用訪問表或索引,例如從一個索引列裏選取最小值能夠經過單獨索引查找完成。
select_type示查詢中每一個select子句的類型性能
- SIMPLE:查詢中不包含子查詢或者UNION
- 查詢中若包含任何複雜的子部分,最外層查詢則被標記爲:PRIMARY
- 在SELECT或WHERE列表中包含了子查詢,該子查詢被標記爲:SUBQUERY
- 在FROM列表中包含的子查詢被標記爲:DERIVED(衍生)用來表示包含在from子句中的子查詢的select,mysql會遞歸執行並將結果放到一個臨時表中。服務器內部稱爲"派生表",由於該臨時表是從子查詢中派生出來的
- 若第二個SELECT出如今UNION以後,則被標記爲UNION;若UNION包含在FROM子句的子查詢中,外層SELECT將被標記爲:DERIVED
- 從UNION表獲取結果的SELECT被標記爲:UNION RESULT
possible_keys指出MySQL能使用哪一個索引在表中找到記錄,查詢涉及到的字段上若存在索引,則該索引將被列出,但不必定被查詢使用fetch
key顯示MySQL在查詢中實際使用的索引,若沒有使用索引,顯示爲NULL優化
key_len表示索引中使用的字節數,可經過該列計算查詢中使用的索引的長度(key_len顯示的值爲索引字段的最大可能長度,並不是實際使用長度,即key_len是根據表定義計算而得,不是經過表內檢索出的)排序
ref表示上述表的鏈接匹配條件,即哪些列或常量被用於查找索引列上的值遞歸
rows表示MySQL根據表統計信息及索引選用狀況,估算的找到所需的記錄所須要讀取的行數
總結:
• EXPLAIN不會告訴你關於觸發器、存儲過程的信息或用戶自定義函數對查詢的影響狀況
• EXPLAIN不考慮各類Cache
• EXPLAIN不能顯示MySQL在執行查詢時所做的優化工做
• 部分統計信息是估算的,並不是精確值
• EXPALIN只能解釋SELECT操做,其餘操做要重寫爲SELECT後查看執行計劃 。
PHP結果集優化
- mysql_fetch_row() 該函數將一條結果集返回並以一個普通索引數組的形式顯示
- mysl_fetch_assoc() 該函數將一條結果集返回並以一個普通關聯數組的形式顯示
- mysql_fetch_array() 該函數能夠將結果數據表中的一行獲取爲一個關聯數組或者索引數組。
若是沒有特殊要求,儘可能不要使用mysl_fetch_array()方法。使用mysql_fetch_row()或者mysl_fetch_assoc()函數實現一樣的功能,效率會更加的高。