我在MySQL性能优化书中读到了伪哈希索引,并注意到它们可以帮助提高查询中的性能,例如
... WHERE `slug` = '$slug'
我们可以在DB中添加归档sulg_hash
并将其编入索引。
制作后
UPDATE `table` SET `slug_hash` = CRC32(`slug`)
然后我们只需要替换
... WHERE `slug` = '$slug'
与
... WHERE `slug_hash` = CRC32('$slug') AND `slug` = '$slug'
因为slug_hash
字段是索引系统需要更少的时间来查找我们需要的行,但是这不是uniq,所以我们在查询中留下`slug` ='$ slug'。
我们可以索引slug
字段而不是slug_hash
,但我真的希望整数索引的工作速度比文本索引快得多。
我们也可以用php CRC32函数替换mysql CRC32 原生函数。
问题:
是否有任何问题导致此更改对性能提升不感兴趣?
P.S。 $slug
在代码开始时被转义。
更新: $slug
在我的案例中不包含拉丁字符。我认为它会让搜索更慢,对吗?
答案 0 :(得分:3)
对于小型表格,它比简单
slug
='$ slug'工作得慢 查询。
这不会有问题,因为小表无论如何都意味着非常快速的查询。
在太大的表格中,我们可以进行多次碰撞,因此速度会慢一些。
就是这样。如果要检查完整匹配,则必须查看所有字符。
对于记录,MySQL支持基于字符的列的前缀索引。见this link。他们以此索引为例
CREATE INDEX part_of_name ON customer (name(10));
我更喜欢使用前缀索引',因为您不必更改查询以检查哈希值,甚至更重要的是,您不必在脚本端和数据库内部计算哈希值。计算哈希值不是免费的! ; - )
答案 1 :(得分:0)
为了避免冲突,您可以使用MD5函数生成哈希值,或者更好的SHA1。 SHA1中的理论碰撞率为2 51 ,MD5为2 32 请参阅http://en.wikipedia.org/wiki/Sha1和http://en.wikipedia.org/wiki/Md5