關於MySQL的執行過程:sql
1 MySQL中存在對SQL語句的改寫,經過改寫SQL達到優化SQL語句的目的,如將子查詢改成關聯查詢.數據庫
2 MySQL並無像Oracle 11g那樣緩存執行計劃,在Java開發中PreparedStatement接口對SQL進行預編譯在默認狀況下並無發生.(即便開啓也是在JDBC端緩存,數據庫中並未緩存執行計劃)緩存
3 MySQL通信協議是單向的,不一樣於Oracle.由於這一點,JDBC端只有在接收到全部查詢結果後纔會進行下一步操做.即在JDBC操做中只取出一條數據而後關閉ResultSet的作法,實際上並不會減輕網絡通訊負擔.網絡
4 MySQL會緩存查詢結果,同時MySQL的鏈接和斷開是輕量級的,因此在多數狀況下,將一個複雜的查詢切分爲幾個簡單查詢是很是有意義的.性能
*5 不少人認爲where後面的條件順序影響執行結果.在Oracle下由於會解析語方樹,因此確定是不會有影響的(Oracle解析語方樹是從後往前解析的,以後再生成執行計劃,因此存在兩個錯誤的狀況下後面的錯誤先報出來,會給人後面的語句先執行的錯覺).我的認爲由於MySQL也存在SQL優化,因此不會有影響.實際狀況中確實會有影響,這是由於統計信息,估算成本不夠準確,優化器認爲兩個條件約束力是相同的,因此按書寫計劃來執行.以上是本人關點未經驗證.學習
關於性能測試:測試
select * from actor t where t.first_name='PENELOPE' and t.last_update>'1990-02-15 04:34:33' and 1=1; /*查看消耗,在執行SQL語句後執行,能夠獲取執行後消耗,用於參考優化效果*/ show status like 'Last_query_cost'; /*查看執行計劃*/ explain select * from actor t where t.first_name='PENELOPE' and t.last_update>'1990-02-15 04:34:33'; /*查看重構後的SQL,執行explain 後再執行show warnings能夠看到優化器重寫後的SQL*/ explain select * from actor t where t.first_name='PENELOPE' and t.last_update>'1990-02-15 04:34:33' and 1=1; show warnings;
關於MySQL優化的思想:大數據
<基於Oracle的SQL優化>中強調優"化SQL是基於SQL執行計劃的深入理解".優化
<高性能MySQL>中指出"建立高性能程序是一個環環相扣的難題,除了schema,索引和查詢語句的設計,查詢優化是解開難題的最後一步"設計
不要自覺得比優化器更聰明
參考<高性能MySQL>,<基於Oracle的SQL優化>
結合<基於Oracle的SQL優化>一書,對部分細節進行補充.
本人工做經驗主要以Java,Oracle爲主,以這兩方面爲參考點來分析MySQL.
<高性能MySQL>中以MySQL 5.5爲參考版本,再在MySQL已經到8.x版本,書中不少內容在MySQL5.7版本下測試結果與書中描述不符.
MySQL處於學習階段,未接觸過有大數據量的數據庫,因此有些地方未詳細確認