国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

提高MySQL中InnoDB表BLOB列的存儲效率的教程

2024-07-24 13:07:10
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了提高MySQL中InnoDB表BLOB列的存儲效率的教程,InnoDB的優化在MySQL的優化研究中也是一個非常熱門的課題,需要的朋友可以參考下

首先,介紹下關于InnoDB引擎存儲格式的幾個要點:

1、InnoDB可以選擇使用共享表空間或者是獨立表空間方式,建議使用獨立表空間,便于管理、維護。啟用 innodb_file_per_table 選項,5.5以后可以在線動態修改生效,并且執行 ALTER TABLE xx ENGINE = InnoDB 將現有表轉成獨立表空間,早于5.5的版本,修改完這個選項后,需要重啟才能生效;

2、InnoDB的data page默認16KB,5.6版本以后,新增選項 innodb_page_size 可以修改,在5.6以前的版本,只能修改源碼重新編譯,但并不推薦修改這個配置,除非你非常清楚它有什么優缺點;

3、InnoDB的data page在有新數據寫入時,會預留1/16的空間,預留出來的空間可用于后續的新紀錄寫入,減少頻繁的新增data page的開銷;

4、每個data page,至少需要存儲2行記錄。因此理論上行記錄最大長度為8KB,但事實上應該更小,因為還有一些InnoDB內部數據結構要存儲;

5、受限于InnoDB存儲方式,如果數據是順序寫入的話,最理想的情況下,data page的填充率是15/16,但一般沒辦法保證完全的順序寫入,因此,data page的填充率一般是1/2到15/16。因此每個InnoDB表都最好要有一個自增列作為主鍵,使得新紀錄寫入盡可能是順序的;

6、當data page填充率不足1/2時,InnoDB會進行收縮,釋放空閑空間;

7、MySQL 5.6版本的InnoDB引擎當前支持COMPACT、REDUNDANT、DYNAMIC、COMPRESSED四種格式,默認是COMPACT格式,COMPRESSED用的很少且不推薦(見下一條),如果需要用到壓縮特性的話,可以直接考慮TokuDB引擎;

8、COMPACT行格式相比REDUNDANT,大概能節省20%的存儲空間,COMPRESSED相比COMPACT大概能節省50%的存儲空間,但會導致TPS下降了90%。因此強烈不推薦使用COMPRESSED行格式;

9、當行格式為DYNAMIC或COMPRESSED時,TEXT/BLOB之類的長列(long column,也有可能是其他較長的列,不一定只有TEXT/BLOB類型,看具體情況)會完全存儲在一個獨立的data page里,聚集索引頁中只使用20字節的指針指向新的page,這就是所謂的off-page,類似ORACLE的行遷移,磁盤空間浪費較嚴重,且I/O性能也較差。因此,強烈不建議使用BLOB、TEXT、超過255長度的VARCHAR列類型;

10、當InnoDB的文件格式(innodb_file_format)設置為Antelope,并且行格式為COMPACT 或 REDUNDANT 時,BLOB、TEXT或者長VARCHAR列只會將其前768字節存儲在聚集索頁中(最大768字節的作用是便于創建前綴索引/prefix index),其余更多的內容存儲在額外的page里,哪怕只是多了一個字節。因此,所有列長度越短越好;

11、在off-page中存儲的BLOB、TEXT或者長VARCHAR列的page是獨享的,不能共享。因此強烈不建議在一個表中使用多個長列。

綜上,如果在實際業務中,確實需要在InnoDB表中存儲BLOB、TEXT、長VARCHAR列時,有下面幾點建議:

1、盡可能將所有數據序列化、壓縮之后,存儲在同一個列里,避免發生多次off-page;

2、實際最大存儲長度低于255的列,轉成VARCHAR或者CHAR類型(如果是變長數據二者沒區別,如果是定長數據,則使用CHAR類型);

3、如果無法將所有列整合到一個列,可以退而求其次,根據每個列最大長度進行排列組合后拆分成多個子表,盡量是的每個子表的總行長度小于8KB,減少發生off-page的頻率;

4、上述建議是在data page為默認的16KB前提下,如果修改成8KB或者其他大小,請自行根據上述理論進行測試,找到最合適的值;

5、字符型列長度小于255時,無論采用CHAR還是VARCHAR來存儲,或者把VARCHAR列長度定義為255,都不會導致實際表空間增大;

6、一般在游戲領域會用到比較多的BLOB列類型,游戲界同行可以關注下。

下面是測試驗證過程,有耐心的同學可以慢慢看:

  1. # 測試案例:InnoDB中長列存儲效率 
  2. # 測試場景描述: 
  3. # 在InnoDB表中存儲64KB的數據,對比各種不同存儲方式 # 每個表寫入5000行記錄,觀察最后表空間文件大小對比 
  4.  
  5. #表0:所有數據存儲在一個BLOB列中 
  6. CREATE TABLE `t_longcol_0` ( 
  7. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  8. `longcol` blob NOT NULL COMMENT 'store all data in a blob column'
  9. PRIMARY KEY (`id`) 
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; 
  11.  
  12. #相應的數據寫入存儲過程:mysp_longcol_0_ins() 
  13. CREATE PROCEDURE `mysp_longcol_0_ins`( in cnt int ) 
  14. begin 
  15. set @i = 1; 
  16. while @i < cnt do 
  17. insert into t_longcol_0(longcol) select repeat('a',65535); 
  18. set @i = @i + 1; 
  19. end while; 
  20. end
  21.  
  22. #表1:將64KB字節平均存儲在9個列中 
  23. CREATE TABLE `t_longcol_1` ( 
  24. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  25. `longcol1` blob NOT NULL COMMENT 'store all data in 9 blob columns'
  26. `longcol2` blob NOT NULL
  27. `longcol3` blob NOT NULL
  28. `longcol4` blob NOT NULL
  29. `longcol5` blob NOT NULL
  30. `longcol6` blob NOT NULL
  31. `longcol7` blob NOT NULL
  32. `longcol8` blob NOT NULL
  33. `longcol9` blob NOT NULL
  34. PRIMARY KEY (`id`) 
  35. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  36.  
  37. #相應的數據寫入存儲過程:mysp_longcol_1_ins() 
  38. CREATE PROCEDURE `mysp_longcol_1_ins`( in cnt int ) 
  39. begin 
  40. set @i = 1; 
  41. while @i < cnt do 
  42. insert into t_longcol_1(longcol1,longcol2,longcol3,longcol4,longcol5,longcol6,longcol7,longcol8,longcol9) select 
  43. repeat('a',7500), 
  44. repeat('a',7500), 
  45. repeat('a',7500), 
  46. repeat('a',7500), 
  47. repeat('a',7500), 
  48. repeat('a',7500), 
  49. repeat('a',7500), 
  50. repeat('a',7500), 
  51. repeat('a',5535); 
  52. set @i = @i + 1; 
  53. end while; 
  54. end
  55.  
  56. #表2:將64KB數據離散存儲在多個BLOB列中 
  57. CREATE TABLE `t_longcol_2` ( 
  58. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  59. `longcol1` blob NOT NULL COMMENT 'store 100 bytes data'
  60. `longcol2` blob NOT NULL COMMENT 'store 100 bytes data'
  61. `longcol3` blob NOT NULL COMMENT 'store 100 bytes data'
  62. `longcol4` blob NOT NULL COMMENT 'store 100 bytes data'
  63. `longcol5` blob NOT NULL COMMENT 'store 100 bytes data'
  64. `longcol6` blob NOT NULL COMMENT 'store 255 bytes data'
  65. `longcol7` blob NOT NULL COMMENT 'store 368 bytes data'
  66. `longcol8` blob NOT NULL COMMENT 'store 496 bytes data'
  67. `longcol9` blob NOT NULL COMMENT 'store 512 bytes data'
  68. `longcol10` blob NOT NULL COMMENT 'store 640 bytes data'
  69. `longcol11` blob NOT NULL COMMENT 'store 768 bytes data'
  70. `longcol12` blob NOT NULL COMMENT 'store 912 bytes data'
  71. `longcol13` blob NOT NULL COMMENT 'store 1024 bytes data'
  72. `longcol14` blob NOT NULL COMMENT 'store 2048 bytes data'
  73. `longcol15` blob NOT NULL COMMENT 'store 3082 bytes data'
  74. `longcol16` blob NOT NULL COMMENT 'store 4096 bytes data'
  75. `longcol17` blob NOT NULL COMMENT 'store 8192 bytes data'
  76. `longcol18` blob NOT NULL COMMENT 'store 16284 bytes data'
  77. `longcol19` blob NOT NULL COMMENT 'store 20380 bytes data'
  78. `longcol20` blob NOT NULL COMMENT 'store 5977 bytes data'
  79. PRIMARY KEY (`id`) 
  80. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  81.  
  82. #相應的數據寫入存儲過程:mysp_longcol_1_ins() 
  83. CREATE PROCEDURE `mysp_longcol_1_ins`( in cnt int ) 
  84. begin 
  85. set @i = 1; 
  86. while @i < cnt do 
  87. insert into t_longcol_2(longcol1,longcol2,longcol3,longcol4,longcol5,longcol6,longcol7,longcol8,longcol9,longcol10, 
  88. longcol11,longcol12,longcol13,longcol14,longcol15,longcol16,longcol17,longcol18,longcol19,longcol20) select 
  89. repeat('a',100), 
  90. repeat('a',100), 
  91. repeat('a',100), 
  92. repeat('a',100), 
  93. repeat('a',100), 
  94. repeat('a',256), 
  95. repeat('a',368), 
  96. repeat('a',496), 
  97. repeat('a',512), 
  98. repeat('a',640), 
  99. repeat('a',768), 
  100. repeat('a',912), 
  101. repeat('a',1024), 
  102. repeat('a',2048), 
  103. repeat('a',3082), 
  104. repeat('a',4096), 
  105. repeat('a',8192), 
  106. repeat('a',16284), 
  107. repeat('a',20380), 
  108. repeat('a',5977); 
  109. set @i = @i + 1; 
  110. end while; 
  111. end
  112.  
  113. #表3:將64KB數據離散存儲在多個CHARVARCHAR、BLOB列中 
  114. CREATE TABLE `t_longcol_3` ( 
  115. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  116. `longcol1` char(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  117. `longcol2` char(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  118. `longcol3` char(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  119. `longcol4` char(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  120. `longcol5` char(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  121. `longcol6` varchar(256) NOT NULL DEFAULT '' COMMENT 'store 255 bytes data'
  122. `longcol7` varchar(368) NOT NULL DEFAULT '' COMMENT 'store 368 bytes data'
  123. `longcol8` varchar(496) NOT NULL DEFAULT '' COMMENT 'store 496 bytes data'
  124. `longcol9` varchar(512) NOT NULL DEFAULT '' COMMENT 'store 512 bytes data'
  125. `longcol10` varchar(640) NOT NULL DEFAULT '' COMMENT 'store 640 bytes data'
  126. `longcol11` varchar(768) NOT NULL DEFAULT '' COMMENT 'store 768 bytes data'
  127. `longcol12` varchar(912) NOT NULL DEFAULT '' COMMENT 'store 912 bytes data'
  128. `longcol13` varchar(1024) NOT NULL DEFAULT '' COMMENT 'store 1024 bytes data'
  129. `longcol14` varchar(2048) NOT NULL DEFAULT '' COMMENT 'store 2048 bytes data'
  130. `longcol15` varchar(3082) NOT NULL DEFAULT '' COMMENT 'store 3082 bytes data'
  131. `longcol16` varchar(4096) NOT NULL DEFAULT '' COMMENT 'store 4096 bytes data'
  132. `longcol17` blob NOT NULL COMMENT 'store 8192 bytes data'
  133. `longcol18` blob NOT NULL COMMENT 'store 16284 bytes data'
  134. `longcol19` blob NOT NULL COMMENT 'store 20380 bytes data'
  135. `longcol20` varchar(5977) NOT NULL DEFAULT '' COMMENT 'store 5977 bytes data'
  136. PRIMARY KEY (`id`) 
  137. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  138.  
  139. #相應的數據寫入存儲過程:mysp_longcol_3_ins() 
  140. CREATE PROCEDURE `mysp_longcol_1_ins`( in cnt int ) 
  141. begin 
  142. set @i = 1; 
  143. while @i < cnt do 
  144. insert into t_longcol_3(longcol1,longcol2,longcol3,longcol4,longcol5,longcol6,longcol7,longcol8,longcol9,longcol10, 
  145. longcol11,longcol12,longcol13,longcol14,longcol15,longcol16,longcol17,longcol18,longcol19,longcol20) select 
  146. repeat('a',100), 
  147. repeat('a',100), 
  148. repeat('a',100), 
  149. repeat('a',100), 
  150. repeat('a',100), 
  151. repeat('a',256), 
  152. repeat('a',368), 
  153. repeat('a',496), 
  154. repeat('a',512), 
  155. repeat('a',640), 
  156. repeat('a',768), 
  157. repeat('a',912), 
  158. repeat('a',1024), 
  159. repeat('a',2048), 
  160. repeat('a',3082), 
  161. repeat('a',4096), 
  162. repeat('a',8192), 
  163. repeat('a',16284), 
  164. repeat('a',20380), 
  165. repeat('a',5977); 
  166. set @i = @i + 1; 
  167. end while; 
  168. end
  169.  
  170. #表4:將64KB數據離散存儲在多個VARCHAR、BLOB列中,對比t_longcol_3中幾個列是CHAR的情況 
  171. CREATE TABLE `t_longcol_4` ( 
  172. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  173. `longcol1` varchar(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  174. `longcol2` varchar(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  175. `longcol3` varchar(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  176. `longcol4` varchar(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  177. `longcol5` varchar(100) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  178. `longcol6` varchar(256) NOT NULL DEFAULT '' COMMENT 'store 255 bytes data'
  179. `longcol7` varchar(368) NOT NULL DEFAULT '' COMMENT 'store 368 bytes data'
  180. `longcol8` varchar(496) NOT NULL DEFAULT '' COMMENT 'store 496 bytes data'
  181. `longcol9` varchar(512) NOT NULL DEFAULT '' COMMENT 'store 512 bytes data'
  182. `longcol10` varchar(640) NOT NULL DEFAULT '' COMMENT 'store 640 bytes data'
  183. `longcol11` varchar(768) NOT NULL DEFAULT '' COMMENT 'store 768 bytes data'
  184. `longcol12` varchar(912) NOT NULL DEFAULT '' COMMENT 'store 912 bytes data'
  185. `longcol13` varchar(1024) NOT NULL DEFAULT '' COMMENT 'store 1024 bytes data'
  186. `longcol14` varchar(2048) NOT NULL DEFAULT '' COMMENT 'store 2048 bytes data'
  187. `longcol15` varchar(3082) NOT NULL DEFAULT '' COMMENT 'store 3082 bytes data'
  188. `longcol16` varchar(4096) NOT NULL DEFAULT '' COMMENT 'store 4096 bytes data'
  189. `longcol17` blob NOT NULL COMMENT 'store 8192 bytes data'
  190. `longcol18` blob NOT NULL COMMENT 'store 16284 bytes data'
  191. `longcol19` blob NOT NULL COMMENT 'store 20380 bytes data'
  192. `longcol20` varchar(5977) NOT NULL DEFAULT '' COMMENT 'store 5977 bytes data'
  193. PRIMARY KEY (`id`) 
  194. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  195.  
  196. #相應的數據寫入存儲過程:mysp_longcol_4_ins() 
  197. CREATE PROCEDURE `mysp_longcol_1_ins`( in cnt int ) 
  198. begin 
  199. set @i = 1; 
  200. while @i < cnt do 
  201. insert into t_longcol_4(longcol1,longcol2,longcol3,longcol4,longcol5,longcol6,longcol7,longcol8,longcol9,longcol10, 
  202. longcol11,longcol12,longcol13,longcol14,longcol15,longcol16,longcol17,longcol18,longcol19,longcol20) select 
  203. repeat('a',100), 
  204. repeat('a',100), 
  205. repeat('a',100), 
  206. repeat('a',100), 
  207. repeat('a',100), 
  208. repeat('a',256), 
  209. repeat('a',368), 
  210. repeat('a',496), 
  211. repeat('a',512), 
  212. repeat('a',640), 
  213. repeat('a',768), 
  214. repeat('a',912), 
  215. repeat('a',1024), 
  216. repeat('a',2048), 
  217. repeat('a',3082), 
  218. repeat('a',4096), 
  219. repeat('a',8192), 
  220. repeat('a',16284), 
  221. repeat('a',20380), 
  222. repeat('a',5977); 
  223. set @i = @i + 1; 
  224. end while; 
  225. end
  226.  
  227. #表5:將64KB數據離散存儲在多個VARCHAR、BLOB列中,和t_longcol_4相比,變化在于前面的幾個列長度改成了255,但實際存儲長度還是100字節 
  228. CREATE TABLE `t_longcol_5` ( 
  229. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  230. `longcol1` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  231. `longcol2` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  232. `longcol3` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  233. `longcol4` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  234. `longcol5` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  235. `longcol6` varchar(256) NOT NULL DEFAULT '' COMMENT 'store 255 bytes data'
  236. `longcol7` varchar(368) NOT NULL DEFAULT '' COMMENT 'store 368 bytes data'
  237. `longcol8` varchar(496) NOT NULL DEFAULT '' COMMENT 'store 496 bytes data'
  238. `longcol9` varchar(512) NOT NULL DEFAULT '' COMMENT 'store 512 bytes data'
  239. `longcol10` varchar(640) NOT NULL DEFAULT '' COMMENT 'store 640 bytes data'
  240. `longcol11` varchar(768) NOT NULL DEFAULT '' COMMENT 'store 768 bytes data'
  241. `longcol12` varchar(912) NOT NULL DEFAULT '' COMMENT 'store 912 bytes data'
  242. `longcol13` varchar(1024) NOT NULL DEFAULT '' COMMENT 'store 1024 bytes data'
  243. `longcol14` varchar(2048) NOT NULL DEFAULT '' COMMENT 'store 2048 bytes data'
  244. `longcol15` varchar(3082) NOT NULL DEFAULT '' COMMENT 'store 3082 bytes data'
  245. `longcol16` varchar(4096) NOT NULL DEFAULT '' COMMENT 'store 4096 bytes data'
  246. `longcol17` blob NOT NULL COMMENT 'store 8192 bytes data'
  247. `longcol18` blob NOT NULL COMMENT 'store 16284 bytes data'
  248. `longcol19` blob NOT NULL COMMENT 'store 20380 bytes data'
  249. `longcol20` varchar(5977) NOT NULL DEFAULT '' COMMENT 'store 5977 bytes data'
  250. PRIMARY KEY (`id`) 
  251. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  252.  
  253. #相應的數據寫入存儲過程:mysp_longcol_5_ins() 
  254. CREATE PROCEDURE `mysp_longcol_1_ins`( in cnt int ) 
  255. begin 
  256. set @i = 1; 
  257. while @i < cnt do 
  258. insert into t_longcol_5(longcol1,longcol2,longcol3,longcol4,longcol5,longcol6,longcol7,longcol8,longcol9,longcol10, 
  259. longcol11,longcol12,longcol13,longcol14,longcol15,longcol16,longcol17,longcol18,longcol19,longcol20) select 
  260. repeat('a',100), 
  261. repeat('a',100), 
  262. repeat('a',100), 
  263. repeat('a',100), 
  264. repeat('a',100), 
  265. repeat('a',256), 
  266. repeat('a',368), 
  267. repeat('a',496), 
  268. repeat('a',512), 
  269. repeat('a',640), 
  270. repeat('a',768), 
  271. repeat('a',912), 
  272. repeat('a',1024), 
  273. repeat('a',2048), 
  274. repeat('a',3082), 
  275. repeat('a',4096), 
  276. repeat('a',8192), 
  277. repeat('a',16284), 
  278. repeat('a',20380), 
  279. repeat('a',5977); 
  280. set @i = @i + 1; 
  281. end while; 
  282. end
  283.  
  284. #從下面開始,參考第3條建議進行分表,每個表所有列長度總和 
  285. #分表1,行最大長度 100 + 100 + 100 + 100 + 100 + 255 + 368 + 496 + 512 + 640 + 768 + 912 + 3082 = 7533 字節 
  286. CREATE TABLE `t_longcol_51` ( 
  287. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  288. `longcol1` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  289. `longcol2` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  290. `longcol3` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  291. `longcol4` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  292. `longcol5` varchar(255) NOT NULL DEFAULT '' COMMENT 'store 100 bytes data'
  293. `longcol6` varchar(256) NOT NULL DEFAULT '' COMMENT 'store 255 bytes data'
  294. `longcol7` varchar(368) NOT NULL DEFAULT '' COMMENT 'store 368 bytes data'
  295. `longcol8` varchar(496) NOT NULL DEFAULT '' COMMENT 'store 496 bytes data'
  296. `longcol9` varchar(512) NOT NULL DEFAULT '' COMMENT 'store 512 bytes data'
  297. `longcol10` varchar(640) NOT NULL DEFAULT '' COMMENT 'store 640 bytes data'
  298. `longcol11` varchar(768) NOT NULL DEFAULT '' COMMENT 'store 768 bytes data'
  299. `longcol12` varchar(912) NOT NULL DEFAULT '' COMMENT 'store 912 bytes data'
  300. `longcol15` varchar(3082) NOT NULL DEFAULT '' COMMENT 'store 3082 bytes data'
  301. PRIMARY KEY (`id`) 
  302. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  303.  
  304. #分表2,行最大長度 1024 + 2048 + 4096 = 7168 字節 
  305. CREATE TABLE `t_longcol_52` ( 
  306. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  307. `longcol13` varchar(1024) NOT NULL DEFAULT '' COMMENT 'store 1024 bytes data'
  308. `longcol14` varchar(2048) NOT NULL DEFAULT '' COMMENT 'store 2048 bytes data'
  309. `longcol16` varchar(4096) NOT NULL DEFAULT '' COMMENT 'store 4096 bytes data'
  310. PRIMARY KEY (`id`) 
  311. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  312.  
  313. #分表3,行最大長度 8192 字節 
  314. CREATE TABLE `t_longcol_53` ( 
  315. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  316. `longcol17` blob NOT NULL COMMENT 'store 8192 bytes data'
  317. PRIMARY KEY (`id`) 
  318. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  319.  
  320. #分表4,行最大長度 16284 + 20380 = 36664 字節 
  321. CREATE TABLE `t_longcol_54` ( 
  322. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  323. `longcol18` blob NOT NULL COMMENT 'store 16284 bytes data'
  324. `longcol19` blob NOT NULL COMMENT 'store 20380 bytes data'
  325. PRIMARY KEY (`id`) 
  326. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  327.  
  328. #分表5,行最大長度 5977 + 4 = 5981 字節 
  329. CREATE TABLE `t_longcol_55` ( 
  330. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  331. `longcol20` varchar(5977) NOT NULL DEFAULT '' COMMENT 'store 5977 bytes data'
  332. PRIMARY KEY (`id`) 
  333. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  334.  
  335. #相應的數據寫入存儲過程:mysp_longcol_51_ins() 
  336. CREATE PROCEDURE `mysp_longcol_51_ins`( in cnt int ) 
  337. begin 
  338. set @i = 1; 
  339. while @i < cnt do 
  340. insert into t_longcol_51(longcol1,longcol2,longcol3,longcol4,longcol5,longcol6,longcol7,longcol8,longcol9,longcol10, 
  341. longcol11,longcol12,longcol15) select 
  342. repeat('a',100), 
  343. repeat('a',100), 
  344. repeat('a',100), 
  345. repeat('a',100), 
  346. repeat('a',100), 
  347. repeat('a',256), 
  348. repeat('a',368), 
  349. repeat('a',496), 
  350. repeat('a',512), 
  351. repeat('a',640), 
  352. repeat('a',768), 
  353. repeat('a',912), 
  354. repeat('a',3082); 
  355.  
  356. insert into t_longcol_52(longcol13,longcol14,longcol16) select 
  357. repeat('a',1024), 
  358. repeat('a',2048), 
  359. repeat('a',4096); 
  360.  
  361. insert into t_longcol_53(longcol17) select repeat('a',8192); 
  362.  
  363. insert into t_longcol_54(longcol18,longcol19) select 
  364. repeat('a',16284), 
  365. repeat('a',20380); 
  366.  
  367. insert into t_longcol_55(longcol20) select repeat('a',5977); 
  368.  
  369. set @i = @i + 1; 
  370. end while; 
  371. end


上述各個測試表都寫入5000行記錄后,再來對比下其表空間文件大小,以及重整表空間后的大小,觀察碎片率。詳細對比見下:

提高MySQL中InnoDB表BLOB列的存儲效率的教程

最后一種分表方式中,5個子表的表空間文件大小總和是 40960 + 40960 + 98304 + 286720 + 40960 = 507904 字節。

可以看到,這種方式的總大小和原始表大小差距最小,其他幾種存儲方式都比這個來的大。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辽阳县| 资中县| 唐河县| 大邑县| 中山市| 沈阳市| 文山县| 河北省| 商南县| 冕宁县| 旬阳县| 陆良县| 托克逊县| 涟源市| 南雄市| 贡觉县| 长顺县| 南郑县| 巴东县| 穆棱市| 阿克苏市| 大足县| 休宁县| 乌海市| 武冈市| 九台市| 桦川县| 德惠市| 隆化县| 芮城县| 龙岩市| 文成县| 常熟市| 左权县| 中卫市| 萍乡市| 自贡市| 巨野县| 沅江市| 连平县| 怀集县|