思考实验:
您有一个允许用户上传图像的CMS,每个页面都作为一行存储在数据库中。当一个用户 上传图像,它被转换为base64编码的字符串。该 上传脚本然后更改表中的
ENUM
列并添加base64编码 string作为允许的可枚举值。在CMS的前端,在页面上运行SELECT语句,ENUM列的值将用于使用data url渲染图像。
写一个WHERE
子句与枚举值匹配的select语句是否比WHERE
子句与varchar列匹配的查询有任何性能优势?
...为了记录,我知道这对于CMS来说是一个绝对可怕的设计。我更感兴趣的是通过这种设置来了解MySQL将如何遭受(或茁壮成长)。
答案 0 :(得分:0)
枚举存储实际上只是您存储字段的值的索引。所以你不会存储base64数据,只是它的关联索引在mysql存储枚举值的任何并行表中。
但是,请考虑实际的SQL查询字符串必须包含完整的base64数据,因此您不必要地增加查询字符串的大小。考虑单个像素jpeg仍然(大约)119字节,而base64形式占用160个字符。这可能是浪费空间的150多个字符。对于即使是中等大小的图像,您的查询字符串也会更大,并且可能很容易超过mysql的max_allowed_packet设置。