【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同步問題之Slave延遲很大最佳化方法MySql
- 使用延遲關聯實現高效分頁
- MySQL之 從複製延遲問題排查MySql
- WebGL之延遲著色Web
- mysql主從延遲複製MySql
- MySQL 延遲從庫介紹MySql
- 第49問:如何快速判斷 IO 延遲對 MySQL 效能的影響MySql
- MySQL exists關聯子查詢SQL效能及其低下最佳化之等值子查詢轉換MySql
- mysql之 誤用SECONDS_BEHIND_MASTER衡量MYSQL主備的延遲時間MySqlAST
- 一次系統延遲性最佳化案例
- 最佳化Extract抽取程式效能,解決OGG抽取日誌延遲 2017-11-12 1758
- 從Mysql slave system lock延遲說開去MySql
- MySQL 中讀寫分離資料延遲MySql
- MySQL主從複製延遲解決方案MySql
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- MySQL中slave監控的延遲情況分析MySql
- 延遲繫結
- Mysql效能最佳化(三)MySql
- 前端效能優化——延遲載入和非同步載入前端優化非同步
- Java物件重用如何降低延遲並提高效能 - MinborgJava物件
- Apache Pulsar 與 Kafka 效能比較:延遲性(測試方法)ApacheKafka
- 【MySQL】六、常見slave 延遲原因以及解決方法MySql
- MySQL主從複製延遲原因及處理思路MySql
- mysql同步(複製)延遲的原因及解決方案MySql
- 轉化率模型之轉化資料延遲模型
- redis 延遲佇列Redis佇列
- Mybatis延遲查詢MyBatis
- Laravel 延遲佇列Laravel佇列
- 疫情延遲 題解
- MySQL查詢效能最佳化MySql
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- 延遲更年期是長壽的關鍵嗎?
- MySQL 8 複製(三)——延遲複製與部分複製MySql
- Mysql 非同步複製延遲的原因及解決方案MySql非同步
- 在Linux中,mysql 如何減少主從複製延遲?LinuxMySql
- Mysql 建立心跳錶來監控Replication的Slave是否延遲MySql
- 啟動優化之動態庫延遲載入優化
- SpringCloud 2020.0.4 系列之 Stream 延遲訊息 的實現SpringGCCloud