【MySQL】 效能優化之 延遲關聯
【背景】
某業務資料庫load 報警異常,cpu usr 達到30-40 ,居高不下。使用工具檢視資料庫正在執行的sql ,排在前面的大部分是:
表的資料量大致有36w左右,該sql是一個非常典型的排序+分頁查詢:order by col limit N,OFFSET M , MySQL 執行此類sql時需要先掃描到N行,然後再去取 M行。對於此類大資料量的排序操作,取前面少數幾行資料會很快,但是越靠後,sql的效能就會越差,因為N越大,MySQL 需要掃描不需要的資料然後在丟掉,這樣耗費大量的時間。
【分析】
針對limit 優化有很多種方式,
1 前端加快取,減少落到庫的查詢操作
2 優化SQL
3 使用書籤方式 ,記錄上次查詢最新/大的id值,向後追溯 M行記錄。
4 使用Sphinx 搜尋優化。
對於第二種方式 我們推薦使用"延遲關聯"的方法來優化排序操作,何謂"延遲關聯" :通過使用覆蓋索引查詢返回需要的主鍵,再根據主鍵關聯原表獲得需要的資料。
【解決】
根據延遲關聯的思路,修改SQL 如下:
優化前
其執行時間:
優化後:
執行時間:
優化後 執行時間 為原來的1/3 。
如果您覺得從這篇文章受益,可以贊助 北在南方 一瓶飲料 ^_^
某業務資料庫load 報警異常,cpu usr 達到30-40 ,居高不下。使用工具檢視資料庫正在執行的sql ,排在前面的大部分是:
- SELECT id, cu_id, name, info, biz_type, gmt_create, gmt_modified,start_time, end_time, market_type, back_leaf_category,item_status,picuture_url FROM relation where biz_type ='0' AND end_time >='2014-05-29' ORDER BY id asc LIMIT 149420 ,20;
【分析】
針對limit 優化有很多種方式,
1 前端加快取,減少落到庫的查詢操作
2 優化SQL
3 使用書籤方式 ,記錄上次查詢最新/大的id值,向後追溯 M行記錄。
4 使用Sphinx 搜尋優化。
對於第二種方式 我們推薦使用"延遲關聯"的方法來優化排序操作,何謂"延遲關聯" :通過使用覆蓋索引查詢返回需要的主鍵,再根據主鍵關聯原表獲得需要的資料。
【解決】
根據延遲關聯的思路,修改SQL 如下:
優化前
點選(此處)摺疊或開啟
-
root@xxx 12:33:48>explain SELECT id, cu_id, name, info, biz_type, gmt_create, gmt_modified,start_time, end_time, market_type, back_leaf_category,item_status,picuture_url FROM relation where biz_type =\'0\' AND end_time >=\'2014-05-29\' ORDER BY id asc LIMIT 149420 ,20;
-
+----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
-
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
-
+----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
-
| 1 | SIMPLE | relation | range | ind_endtime | ind_endtime | 9 | NULL | 349622 | Using where; Using filesort |
-
+----+-------------+-------------+-------+---------------+-------------+---------+------+--------+-----------------------------+
- 1 row in set (0.00 sec)
優化後:
點選(此處)摺疊或開啟
- SELECT a.* FROM relation a, (select id from relation where biz_type ='0' AND end_time >='2014-05-29' ORDER BY id asc LIMIT 149420 ,20 ) b where a.id=b.id
-
root@xxx 12:33:43>explain SELECT a.* FROM relation a, (select id from relation where biz_type ='0' AND end_time >='2014-05-29' ORDER BY id asc LIMIT 149420 ,20 ) b where a.id=b.id;
-
+----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
-
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
-
+----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
-
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 20 | |
-
| 1 | PRIMARY | a | eq_ref | PRIMARY | PRIMARY | 8 | b.id | 1 | |
-
| 2 | DERIVED | relation | index | ind_endtime | PRIMARY | 8 | NULL | 733552 | |
-
+----+-------------+-------------+--------+---------------+---------+---------+------+--------+-------+
- 3 rows in set (0.36 sec)
優化後 執行時間 為原來的1/3 。
如果您覺得從這篇文章受益,可以贊助 北在南方 一瓶飲料 ^_^
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1177385/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【MySQL】 效能最佳化之 延遲關聯MySql
- MySQL 效能優化:效能提升 50%,延遲降低 60%MySql優化
- MySQL Slave延遲很大優化方法MySql優化
- C#效能優化之Lazy<T> 實現延遲初始化C#優化
- Web效能優化系列(3):如何延遲載入JSWeb優化JS
- 前端效能優化——延遲載入和非同步載入前端優化非同步
- MySQL 效能優化之索引優化MySql優化索引
- MySQL 效能優化之SQL優化MySql優化
- 啟動優化之動態庫延遲載入優化
- 使用延遲關聯實現高效分頁
- mysql同步問題之Slave延遲很大最佳化方法MySql
- mysql關聯查詢優化MySql優化
- 利用Python延遲初始化提升效能Python
- 「視訊直播技術詳解」系列之五:延遲優化優化
- 【MySQL】效能優化之 order by (一)MySql優化
- MySQL 效能優化之快取引數優化MySql優化快取
- MySQL之 從複製延遲問題排查MySql
- 轉化率模型之轉化資料延遲模型
- MySQL效能優化之索引設計MySql優化索引
- 【MySQL】效能優化之 覆蓋索引MySql優化索引
- WebGL之延遲著色Web
- mysql效能優化MySql優化
- MySQL——效能優化MySql優化
- 【MySQL】三、效能優化之 覆蓋索引MySql優化索引
- 《MySQL 效能優化》之 InnoDB 儲存引擎MySql優化儲存引擎
- 【MySQL】效能優化之 count(*) VS count(col)MySql優化
- 【MySQL】效能優化之 index merge (1)MySql優化Index
- 主從延遲調優思路
- 3.官方優化建議3.1網路延遲優化
- SQL之延遲約束SQL
- zookeeper之watch事件延遲事件
- java多執行緒之延遲初始化Java執行緒
- 效能優化之關於畫素管道及優化(二)優化
- mysql主從延遲複製MySql
- MySQL 5.7 延遲複製配置MySql
- MySQL 延遲從庫介紹MySql
- MySQL 資料庫效能優化之快取引數優化MySql資料庫優化快取
- MySQL資料庫效能優化之表結構優化(轉)MySql資料庫優化