我在 MySQL 性能优化书中读到了关于伪哈希索引的内容,并注意到它们可以帮助提高查询的性能,例如
... WHERE `slug` = '$slug'
我们可以在数据库中添加归档的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 原生函数功能。
问题:
- 对于小型表,它的运行速度会比简单的`slug` = '$slug'查询慢。
- 在太大的表中,我们可能会发生很多冲突,因此运行速度会变慢。
是否存在任何问题导致此更改对于性能提升没有意义?
附注$slug
在代码开头被转义。
更新: $slug
在我的情况下不包含拉丁字符。我认为这会使搜索速度变慢,对吗?
最佳答案
For small tables it will work slower than simple
slug
= '$slug' query.
这不会成为问题,因为小表无论如何都意味着非常快的查询。
In too big tables we can have many collisions so it will work slower.
事情就是这样。如果您想检查完整匹配,则必须查看所有字符。
根据记录,MySQL 支持基于字符的列的前缀索引'。请参阅this link 。他们有这个索引作为例子
CREATE INDEX part_of_name ON customer (name(10));
我更喜欢使用前缀索引',因为您不必更改查询来检查哈希值,也许更重要的是,您不必在脚本端和数据库内部计算哈希值。计算哈希值不是免费的! ;-)
关于php - slug 的伪哈希索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9427980/