我需要使用非常简单的表结构在MySQL-DB中保存xml-strings。
xml_ID int(10), xml text
插入新字符串时,我想检查重复项。我的数据库包含几乎超过10k的项目,并且WHERE的比较非常慢。所以我决定添加一个列并用字符串的校验和填充它。
xml_ID int(10), xml text, md5 binary(32)
因为校验和不是字符串的biunique,所以我不仅可以比较校验和。所以我仍然需要比较字符串本身。
现在我的问题:什么是更快/更好?包含2个WHERE条件的选择请求,如:
SELECT xml_ID
FROM table
WHERE
md5=MD5('<content>hello</content>') AND
xml='<content>hello</content>'
或使用子查询的请求,如:
SELECT xml_ID
FROM (
SELECT *
FROM table
WHERE md5=MD5('<content>hello</content>')
) AS t
WHERE xml='<content>hello</content>'
我到目前为止测试了它,但两个请求几乎需要相同的时间才能得到结果。
校验和是否必要?
我也对任何其他建议持开放态度......
谢谢...
答案 0 :(得分:0)
即使是微不足道的MD5也不太可能有重复,而不是在小行星撞击地球的同时赢得大型彩票。
所以,只需
SELECT ...
FROM ...
WHERE md5 = MD5(...);
并且INDEX(md5)
- 缺少索引可能就是为什么它很慢。
在一个9万亿md5的表中,9万亿只有一次机会,你有不同字符串的相同的两个md5。
注意 - 当md5上的索引太大而无法缓存时,性能将受到影响。 (10K行应该不是问题。)