MySQL online ddl擴展字段長度
點擊上方“IT那活兒”公眾號,關注后了解更多內容,不管IT什么活兒,干就完了!??!
從MySQL5.5開始支持online ddl,5.6版本更加完善,一直到MySQL8.0版本,支持了更多alter table語句通過online ddl快速的執行,在執行效率、降低鎖表時間以及IO消耗上有了很大的提升。在日常運維MySQL時,ddl執行的最多的大概就是擴展varchar字段長度的情況,但是面對一定數據量的表,在執行時間上有時很快,有時執行起來很慢,這是什么原因?
可以看到兩次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表執行,速度較慢。通過顯示指定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在加載內存臨時表的時候,會將字段定義的所有的長度加載到內存中,而不是實際的長度,同樣又會造成資源消耗。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129105.html