天天看點

【七天深入MySQL實戰營】答疑彙總Day7 MySQL分支 - AliSQL 的性能優化實戰

Day1 MySQL MGR 8.0 高可用實戰

https://developer.aliyun.com/article/781434



Day2 MySQL 高并發場景實戰

https://developer.aliyun.com/article/781435

Day3 MySQL Java 開發實戰

https://developer.aliyun.com/article/781436

Day4 MySQL查詢優化實戰

https://developer.aliyun.com/article/781439

Day5 MySQL 開發規約實戰

https://developer.aliyun.com/article/781442

Day6 MySQL表和索引優化實戰

https://developer.aliyun.com/article/781445

Day7 MySQL分支 - AliSQL 的性能優化實戰

https://developer.aliyun.com/article/781446

【最後一課】【MySQL分支 - AliSQL 的性能優化實戰】

講師:黃忠,阿裡雲資深技術專家。

課程内容:深入介紹AliSQL的幾個核心通用性能優化技術;抽絲剝繭,帶你整體學習從問題提出到解決方案落地全過程。

答疑彙總:特别感謝班委@陳亮 同學

Q1:主從複制 和MGR 複制,主從切換後,應用如何感覺,謝謝?

A1:最早期技術方案會選擇DNS,但是DNS存在cache不及時的問題。第二種方法通過IP直接切主庫,這種方式相比DNS很快。第三種方法前面加proxy,由proxy來實時感覺後端的狀态。還有在應用裡自主判斷,rds的HA也可以實時切換IP進行鍊路連接配接,rds如果用了proxy鍊路會主動感覺後端的切換狀态,快速識别後端的主庫。

Q2:老師好,請問分庫分表怎麼確定主鍵的唯一,保證事務的完整性?

A2:mysql另外部署一個序列的生成器,在alisql有sequence,可以用來在分布式情況下自動生成主鍵;另外業務有自己明确的編号,可以後端不生成另外的主鍵。在分庫分表又在不同執行個體的情況下,就要用分布式事務來保證,但是分布式事務太多會影響效率。

Q3:alisql 線程池 跟percona 線程池有什麼差別?

A3:最早是一樣的,percona 線程池不能在任何情形下都開啟,alisql進行了創新,對不同線程進行隔離,把讀請求和寫請求分離,比如再對不同的讀請求進行文法梳理進行拆分歸類成複雜和簡單隊列,來解決線程池中相對的公平。原則上是将不同的請求歸類再配置設定到不同的線程隊列中執行,讓快的快,讓線程池适應不同的場景。

Q4:低并發場景下,比如64并發,不開啟線程池比開啟線程池性能好的原因是什麼呢?望解答,謝謝

A4:這是一個相對的值還要看資源。當CPU足夠時,不開線程池請求會直接到工作線程,但是開了線程池會有工作線程入隊列和出隊列的操作,在64并發時會有點影響,當資源足夠時這時入隊出隊會變成負擔。如果資源不夠的情況下,線程池雖然有IO隊列的成本,但對CPU線程執行會有提升。要了解課程裡講的線程池的收益。

Q5:RDS的flashbak、sql outline功能會開源嗎?

A5:這兩個功能很好,但是需要跟着開源計劃去規劃,目前不确定。

Q6:mysql 5.7 查詢緩存表更新失效問題,alisql 有這個問題麼?

A6: alisql沒有這個問題,完全重寫了。Alisql給每個對象維護了一個版本号,更新時隻更新版本号,查詢的時候隻查詢對應的版本号,相當于顆粒度更細。

Q7:MySQL 邏輯時鐘執行原理是怎麼樣的呢?

A7:我了解這是logical_clock的執行原理,它主要是用來辨別主庫的哪些資訊在從庫是可以并行執行的。

Q8:老師,可以從oracle , mysql 5.7/ 8.0 遷移資料到 alisql

麼?遷移友善麼?

A8:有上雲服務,通過備份來進行實體遷移等等。

Q9:oracle 的存儲過程支援麼

A9:mysql支援存儲過程,兩個文法上會不同。

Q10:經常有開發要建立一個5字段的唯一索引,有什麼好的建議?

A10:要從業務角度需要重新思考這樣的業務模型,比如我們的交易号裡包含交易日期,交易号等等把很多資訊內建到一個主鍵。

Q11:主從複制邏輯時鐘的工作原理是怎麼樣的?

A11:同Q7。

Q12:alisql 支援全局事務麼? alisql 百億大表查詢快麼?

A12:alisql大表查詢性能會更好一些,已經有很多的優化。全局事務參考這個文檔

https://help.aliyun.com/document_detail/197571.html?spm=a2c4g.11186623.6.607.5f144dbeVC9ezv

Q13:功能 binlog in redo 的初衷是什麼??

A13:commit的時間存在兩次IO的刷盤,希望通過減少一次IO又能提升性能,保證binlog事務的完整一緻性。

Q14:innnodb_buffer_pool_instance參數的配置,通常需要考慮哪些資訊,配置成 1 和 4 ,最主要的差別在哪裡?

A14:Mysql buffer查詢塊需要鎖頁,當并發高時,鎖會非常集中。如果bp比較大,可以考慮增加buffer pool instance,比如4G以下設定成1,8G設定成2,16G設定成4,關鍵在于增大操作不同執行個體的并行度,雖然有助于降低機器CPU,不算是優化的關鍵點。參考文檔

https://developer.aliyun.com/article/174241

Q15:老師好,我現在遇到個生産問題,雲下centos7上單執行個體mysql5.7在3個月記憶體使用緩慢上升,目前90%以上(32G記憶體),KILL應用連接配接沒有用,除了重新開機執行個體,該如何釋放記憶體,并有效限制MySQL對記憶體的使用?

A15:centos 7的記憶體分成了多個buffer,這個多buffer機制會造成記憶體偏高,可以使用jemalloc,但jemalloc也得挑好版本才行;第二個是不是打開了performance schema,如果你的SQL是動态生成的,可能會占用很多記憶體;第三個看一下後續版本有沒有相關的memory bug fix。還有一些原因,要具體情況具體分析。