這篇文章帶給大家的內容是關於mysql中select和where子句優化的總結,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
資料庫最佳化:
1.可以在單一SQL語句,整個應用程序,單一資料庫伺服器或多個聯網資料庫伺服器的層級進行最佳化
2.資料庫效能取決於資料庫層級的幾個因素,例如表,查詢和配置設定
3.在資料庫層級進行最佳化,在硬體層級進行最佳化,平衡可攜性和效能
4.合適的結構,合適的資料類型;執行頻繁更新的應用程式大量表(少列);分析大量資料的應用程式少量表(多列);選擇合適的儲存引擎和索引;
5.壓縮適用於InnoDB表的各種工作負載,以及只讀MyISAM表
6.選擇合適的鎖定策略;InnoDB儲存引擎可以處理大多數鎖定問題
7.配置的主要記憶體區域是InnoDB緩衝池和MyISAM密鑰緩存。
8.優化select語句,這方面技巧同樣適用於其他帶where的delete語句等,在where子句的列上設定索引;索引對於引用多個列如join和外鍵尤其重要
#select where子句最佳化:
1.調整查詢的結構,例如函數呼叫,為結果集中的每一行只呼叫一次,為表中的每一行只呼叫一次
2.減少查詢中的全表掃描數
3.定期使用ANALYZE TABLE語句使表統計資訊保持最新
4.了解特定於每個表的存儲引擎的調優技術,索引技術和配置參數
5.最佳化InnoDB表的單一查詢事務
6.透過閱讀EXPLAIN計劃並調整索引,WHERE子句,連接子句等來調查特定查詢的內部詳細資訊
7.調整MySQL用於快取的記憶體區域的大小和屬性。透過有效使用InnoDB緩衝池,MyISAM金鑰快取和MySQL查詢快取
8.where條件,去掉不必要的括號,恆定折疊,恆定條件去除,減少不必要的邏輯
9.被索引使用的常數表達式只計算一次
10.count(*)直接從表格資訊查詢;當只有一張表時,not null表達式也是這樣
11.如果不使用GROUP BY或聚合函數(COUNT (),MIN()等),HAVING將與WHERE合併
12.常量表,只有一行或空表;where子句作用在primary key或unique索引上
13.如果ORDER BY和GROUP BY子句中的所有列都來自同一個表,則在連接時首選該表
14.如果order by子句和group by子句不一樣,或來自不同的表,則會建立臨時表
15.如果使用SQL_SMALL_RESULT修飾符,MySQL將使用記憶體中的臨時表
16.MySQL甚至無需諮詢資料檔案即可只從索引中讀取行
17.在輸出每一行之前,將跳過與HAVING子句不符的行
以下表被用作常數量表:
SELECT * FROM t WHERE primary_key=1; SELECT * FROM t1,t2 WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
以下查詢運行速度非常快:
SELECT COUNT(*) FROM tbl_name; SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name; SELECT MAX(key_part2) FROM tbl_name WHERE key_part1=constant; SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... LIMIT 10; SELECT ... FROM tbl_name ORDER BY key_part1 DESC, key_part2 DESC, ... LIMIT 10;假設索引列是數值類型,以下查詢僅用到了索引樹:
SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val; SELECT COUNT(*) FROM tbl_name WHERE key_part1=val1 AND key_part2=val2; SELECT key_part2 FROM tbl_name GROUP BY key_part1;
以下查詢使用索引按排序順序取回資料,不需要單獨排序
SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... ; SELECT ... FROM tbl_name ORDER BY key_part1 DESC, key_part2 DESC, ... ;
以上是mysql中select和where子句最佳化的總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!