MariaDB存4500-5000长度文本:TEXT(5000)与20个CHAR(250)查询性能对比
结论
TABLE1的查询性能明显更优,原因如下:
核心查询逻辑无差异
两种表结构的查询都是走TT_HASH唯一索引,InnoDB二级索引的查询流程完全一致:先查TT_HASH索引拿到主键TT_INDEX,再回表查聚集索引取文本内容,这一步不存在性能差别。
性能差距来自回表后的数据读取和处理开销
字段读取成本更低
TABLE2用20个CHAR(250)定长字段存储文本,单条记录需要读取20个字段才能凑齐完整内容;而TABLE1只需要读取1个TEXT字段就能直接拿到完整文本,读取字段数少了20倍,IO开销更低。
如果使用utf8mb4编码,20个CHAR(250)的最大存储长度为20*250*4=20000字节,已经超过InnoDB默认16KB的页大小,会触发行溢出,此时TABLE2需要读取20个溢出页才能拿到完整文本,而TABLE1最多只需要读取1次溢出页,开销差距会进一步拉大。无额外拼接开销
TABLE2拿到20个分段的文本后,不管是在数据库层用CONCAT函数拼接,还是在应用层拼接,都会产生额外的CPU开销,而TABLE1直接返回完整文本,完全没有这部分成本。缓冲池命中率更高
CHAR是定长存储,哪怕实际文本只有4500长度,20个CHAR(250)也会占用满额5000字符的存储空间;而TEXT是变长存储,只会占用实际文本长度对应的空间。TABLE1单行数据占用空间更小,相同大小的InnoDB缓冲池可以缓存更多行数据,缓存命中率更高,进一步提升查询性能。
内容的提问来源于stack exchange,提问作者user7242195
相关产品推荐
相关产品推荐

