mysql查詢過程: 客戶端發送查詢請求。 伺服器檢查查詢緩存,如果命中緩存,則返回結果,否則,繼續執行。 伺服器進行sql解析,預處理,再由優化器生成執行計劃。 Mysql調用存儲引擎API執行優化器生成的執行計划進行查詢。 返回結果。 mysql查詢過程: 優化數據訪問: 是否查詢了多餘的記錄; ...
mysql查詢過程:
- 客戶端發送查詢請求。
- 伺服器檢查查詢緩存,如果命中緩存,則返回結果,否則,繼續執行。
- 伺服器進行sql解析,預處理,再由優化器生成執行計劃。
- Mysql調用存儲引擎API執行優化器生成的執行計划進行查詢。
- 返回結果。
優化數據訪問:
- 只獲取必要的數據:
- 是否查詢了多餘的記錄;
- 多表關聯時是否返回了全部列;
- 是否總是取出全部列(避免select *);
- 是否重覆查詢相同的數據(緩存代替)。
- 避免額外的記錄掃描:查詢開銷衡量標準(響應時間、掃描行數、返回行數)
- 響應時間:服務時間(執行查詢)+排隊時間(IO或者等待資源、鎖等);快速上線估計法。
- 掃描的行數和返回的行數:一般1:1-->1:10。
- 掃描行數和訪問類型:同一行數據的不同訪問方式(掃描表、索引、範圍訪問、唯一索引、常熟引用、單值訪問)的掃描行數的差異,通常增加索引是一個最直接的方法。大量掃描返回少量行數的查詢優化技巧:
- 使用索引覆蓋掃描:把所有需要的列放到索引中,存儲引擎無需回表獲取對應的行,直接返回結果。
- 改變庫表結構:增加彙總性表存儲,空間換時間,效率。
- 重寫查詢:sql結構。
- 複雜查詢與簡單查詢的選擇:複雜查詢考慮的是網路通信,查詢解析及優化的因素。將複雜查詢分解為多個組合的簡單查詢有時會是不錯的選擇。
- 切分查詢:將大查詢切分為多個相同的小查詢。例如:刪除舊數據時。
- 分解關聯查詢:將分解的單個查詢在應用層進行整合。
- 增加緩存效率:應用服務通常需要緩存常用單表查詢,重覆利用。
- 分解的單個查詢可以減少鎖的競爭。
- 應用層進行關聯,使得資料庫拆分更加容易,構建高性能及高擴展性的程式、服務。
- 查詢效率的提升。
- 減少冗餘記錄的查詢。
- 應用層的哈希關聯效率高於mysql的迴圈嵌套關聯。