【開營第五課】【MySQL 開發規約實戰】
講師:蘆火,阿裡雲運維專家。
課程内容:SQL語句編寫規範;事務的使用與優化;開發中的常見問題與最佳實踐。
答疑彙總:特别感謝班委@陳亮 同學
Q1:根據主鍵進行update ,隻修改一個字段,經常出現超過0.5秒的情況,請問這樣的問題怎麼排查?
A1:update慢通常是阻塞問題比較多,大多數是長事務導緻,建議看執行個體級的性能,關注鎖的性能,IO争搶、記憶體争搶,多從資源上分析是否有問題。如果是主鍵基本上不是索引的問題。
Q2:老師好,請問事務發生多層循環調用,怎麼保證強一緻性?
A2:mysql嵌套事務不支援,在實際場景盡量從開發級别去保證。
Q3:insert插入過慢,幾百條記錄要插幾秒中,有哪些排查思路?
A3:插入問題通常不會因為鎖問題,在主從架構通常半同步,要去看是否有DML。可以考慮把從庫異步關掉再看從庫情況,盡量不要在循環裡寫一個事務,需要按方法論進行排查。
Q4:資料表字段名大家都要求用小寫+下劃線 ,統一用駝峰行不行?會出現什麼大小寫問題?
A4:開發規範适合公司内部使用就OK,内部風格統一就好。沒有強制說必須使用哪一種;大小寫的問題要看開發語言對大小寫是否敏感。
Q5:從5.7遷到8.0,有哪些需要注意的點?單執行個體最多可以建多少個庫呢?
A5:從5.7到8.0,都要注意相容性的問題,然後驗證業務是否正常運作。比如新的關鍵字,取消的文法,字元集,8.0某些變量取消,8.0order by在索引傳回資料方面等等,在課程中有特别講到,可以再回看一下。
Q6:mysql 優化時候,比如有時候需要對字段做類型轉換或者加函數,走不了索引,除了用虛拟列去優化(耗費空間換時間),還有什麼優化思路?
A6:通常虛拟列,日期列,如果是特别複雜的函數也無解。在b-tree索引上基本就是這些用法。
Q7:要小表驅動的時候,是要把 ignore 寫到 sql 裡嗎?還有别的方法嗎?
A7:建議在SQL中盡量減少帶指定業務邏輯,比如索引改名了,會帶來索引失效問題。盡量取消強制索引,對開發透明。
Q8:怎麼優化模糊查詢,使用哪個關鍵字銷率比較高?
A8:盡量少用。
Q9:開啟 optimier_trace 會帶來多大的開銷,實際環境中應當怎麼使用?
A9:可以忽略不計,通常不會在生産環境中一直開啟。
Q10:explain、analyze 會實際執行 sql 嗎?
A10:會。Explain不會,它隻生成計劃樹。Explain Analyze 8.0才有,它會實際執行。可以參考官方文檔
https://dev.mysql.com/doc/refman/8.0/en/using-explain.htmlQ11:mysql memcached 插件成熟嗎?生産使用是否合适?
A11:不建議把插件內建到關系型資料庫中用,專庫專用,緩存用Redis,類似這樣。
Q12:mysql 樹結構查詢有什麼比較好的方案嗎?
A12:在8.0裡面有cte,之前通常用函數去實作樹結構。
Q13:mysql有無SQL優化建議插件?
A13:建議先了解工具原理和sql原理。
Q14:mysql開發在表關聯方面有什麼技巧和需要注意的地方?對于10張表以上的關聯大查詢,該如何優化或拆分?
A14:在寫SQL時要有結果集思維,大表和多表關聯如何讓結果集最小才是最優考慮的。充分用好index,業務上如果可以分步擷取資料,可以考慮拆分。
Q15:mysql如何分析指定時間段内的曆史資料庫會話?有無插件可以記錄?
A15:有。一些第三方工具可以支援,可以網上找找。阿裡雲的審計功能非常全,建議先了解。如果自己實作,可以參考一下阿裡雲的實作。
Q16:對于高效SQL編寫,有無較好的引導工具可以使用?
A16:建議先了解工具原理和sql原理。
Q17:同一條sql主從執行計劃一緻,執行時間不一緻,這種情況如何優化;還有同一條sql主從計劃不一緻的問題?
A17:基本上不太可能。隻可能在某個節點上資源不均勻,資料沒有在buffer pool裡,冷資料需要走IO看看時間能不能對齊。如果一條sql的主從執行計劃不一緻基本上統計資訊的問題,要去更新統計資訊。如果還不準可能就是采樣率的問題,因為從庫是slave回放可能跟主庫的資料分布不一樣,可調大采樣頁數去觀察分析。
Q18:mysql的save point,算是支援嵌套事務吧?
A18:save point是跟開發強相關,跟遞歸也沒有什麼相關性。