天天看點

【七天深入MySQL實戰營】答疑彙總Day5 MySQL 開發規約實戰

【開營第五課】【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.html

Q11: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是跟開發強相關,跟遞歸也沒有什麼相關性。