国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MySQL online ddl擴展字段長度

IT那活兒 / 3717人閱讀
MySQL online ddl擴展字段長度

點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!??!


問 題

從MySQL5.5開始支持online ddl,5.6版本更加完善,一直到MySQL8.0版本,支持了更多alter table語句通過online ddl快速的執行,在執行效率、降低鎖表時間以及IO消耗上有了很大的提升。

在日常運維MySQL時,ddl執行的最多的大概就是擴展varchar字段長度的情況,但是面對一定數據量的表,在執行時間上有時很快,有時執行起來很慢,這是什么原因?


測 試

2.1 創建表t1
表字符集為utf8mb4。
插入一些測試數據:
2.2 執行ddl命令
首先,name字段長度由30擴展至50。
再把name字段長度由50擴展至90。
可以看到兩次ddl的執行時間差異很大, 造成差異的原因是什么呢?

通過MySQL官方文檔得知,這跟varchar的字段所占用的字節數有關。

  • 當占用字節數為0-255字節時(注意是字節,不是字符),需要用一個字節記錄字段的長度;
  • 當占用256及以上的字節時,需要用兩個字節記錄字段的長度;
  • 添加字段長度時,如果添加前后長度都在0-255范圍內,或者大于等于256范圍內,可以通過inplace的算法進行online ddl,如果是從0-255范圍跨到大于等于256 ,就不支持online ddl,只能通過copy的算法進行ddl,所以執行較慢。MySQL會自動根據是否支持online ddl自動處理,所以才會出現擴展varchar字段長度執行有時很快,有時很慢的情況。
通過上面的例子分析,varchar(30) 占用了30個字符,字符集為utf8mb4每個字符4個字節,共占用120個字節,varchar(50) 占用了200個字節,而varchar(90)占用了360個字節,varchar(30)到varchar(50)不涉及跨字節范圍,而從varchar(50)到varchar(90)則涉及到跨字節范圍,所以后者不能通過online ddl執行語句,只能通過原始的方式去copy表執行,速度較慢。
2.3 驗證結論
通過顯示指定inplace的方式,更加明顯的看出,當涉及到跨字節范圍時,MySQL會報錯提示使用copy的方式執行alter table語句。通過使用copy的方式跨話字節范圍后,再次指定inplace 的方式,又可以進行online ddl了。
測試結論:
  • 在創建表時,如果字段的字節長度不會超過256字節,那么建議varchar的字節長度創建時小于256字節;
  • 如果字符串的長度超過200字節,那么varchar的字節長度建議超過256字節。
依據本例,varchar(30)為占用120字節,如果確定不會超過256字節,可以根據實際需求創建小于等于varchar(63);如果預估數據可能會超過256字節,就不要創建低于varchar(64)的,這樣方便以后字段擴展進行使用online ddl。
當然,不建議為了方便online ddl操作,將所有的字段長度都超過256字節,因為MySQL在加載內存臨時表的時候,會將字段定義的所有的長度加載到內存中,而不是實際的長度,同樣又會造成資源消耗。



本文作者:吳 昊(上海新炬中北團隊)

本文來源:“IT那活兒”公眾號

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129105.html

相關文章

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<