【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/22664653/viewspace-1176153/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【MySQL】 效能優化之 延遲關聯MySql優化
- mysql同步問題之Slave延遲很大最佳化方法MySql
- MySQL 效能優化:效能提升 50%,延遲降低 60%MySql優化
- 使用延遲關聯實現高效分頁
- MySQL之 從複製延遲問題排查MySql
- WebGL之延遲著色Web
- SQL之延遲約束SQL
- zookeeper之watch事件延遲事件
- mysql主從延遲複製MySql
- MySQL 5.7 延遲複製配置MySql
- Mysql slave 延遲故障一列MySql
- MySQL Slave延遲很大優化方法MySql優化
- Mysql配置從庫延遲應用MySql
- C#效能優化之Lazy<T> 實現延遲初始化C#優化
- 第49問:如何快速判斷 IO 延遲對 MySQL 效能的影響MySql
- MySQL exists關聯子查詢SQL效能及其低下最佳化之等值子查詢轉換MySql
- 一次系統延遲性最佳化案例
- 【Mysql】Mysql負載過大,app訪問延遲MySql負載APP
- 利用Python延遲初始化提升效能Python
- 【Mysql】Slave 延遲很大並且不動了MySql
- 【MySQL】效能最佳化之 覆蓋索引MySql索引
- mysql效能最佳化之table_cacheMySql
- mysql之 誤用SECONDS_BEHIND_MASTER衡量MYSQL主備的延遲時間MySqlAST
- MySQL 中讀寫分離資料延遲MySql
- MySQL主從複製延遲解決方案MySql
- 從Mysql slave system lock延遲說開去MySql
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- 延遲釋出
- 【MySQL】MySQL效能最佳化之Block Nested-Loop Join(BNL)MySqlBloCOOP
- Web效能優化系列(3):如何延遲載入JSWeb優化JS
- MySQL中slave監控的延遲情況分析MySql
- 【MySQL】常見slave 延遲原因以及解決方法MySql
- 最佳化Extract抽取程式效能,解決OGG抽取日誌延遲 2017-11-12 1758
- PHP延遲靜態繫結:static關鍵字PHP
- Java物件重用如何降低延遲並提高效能 - MinborgJava物件
- 前端效能優化——延遲載入和非同步載入前端優化非同步
- Apache Pulsar 與 Kafka 效能比較:延遲性(測試方法)ApacheKafka
- Mysql效能最佳化(三)MySql