php - slug 的伪哈希索引

标签 php mysql database performance database-design

我在 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 simpleslug = '$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/

相关文章:

php - 当密码为空时,Windows 上的 PDO 会忽略主机名和用户名

php - 计算 PHP DatePeriod() 的迭代次数

mysql - 两个表之间的一对多关系 Spring boot JPA 不起作用

MySQL 在引用表中使用 like 表达式

php - 如何在执行另一个 SQL 查询 x 分钟后执行一个 SQL 查询?

php - 根据字符串内容替换字符串的一部分

php - 使用下一个按钮替换页面上的内容,而不将我重定向到新页面

php - 使用 PHP 上下移动记录

mysql - 延迟启动 SAS EG 中的程序

php - PhalconPHP 动态创建表