在大型mysql数据库中查找long String

时间:2016-01-05 08:24:17

标签: mysql string performance

我需要使用非常简单的表结构在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>'

我到目前为止测试了它,但两个请求几乎需要相同的时间才能得到结果。

校验和是否必要?

我也对任何其他建议持开放态度......

谢谢...

1 个答案:

答案 0 :(得分:0)

即使是微不足道的MD5也不太可能有重复,而不是在小行星撞击地球的同时赢得大型彩票。

所以,只需

SELECT ...
    FROM ...
    WHERE md5 = MD5(...);

并且INDEX(md5) - 缺少索引可能就是为什么它很慢。

在一个9万亿md5的表中,9万亿只有一次机会,你有不同字符串的相同的两个md5。

注意 - 当md5上的索引太大而无法缓存时,性能将受到影响。 (10K行应该不是问题。)