【发布时间】:2020-10-10 11:22:37
【问题描述】:
我有一个包含数百万行的 USER 表。我正在实现一个搜索功能,允许某人通过输入用户名来查找用户。这个自动完成功能需要非常快。鉴于在 MySQL 中,列索引使用 LIKE {string}% 加速查询,以下方法的性能是否足以在 200 毫秒内返回? (注意:这里的内存开销不是问题,用户名最多 30 个字符)。
创建一个 USERSEARCH 表,该表具有用户表的外键和 索引 ngram 用户名列:
USERSEARCH
user_id username_ngram
-------------------------
1 crazyguy23
1 razyguy23
1 azyguy23
1 zyguy23
...
查询将是:
SELECT user_id FROM myapp.usersearch WHERE username_ngram LIKE {string}%
LIMIT 10
我知道存在第三方解决方案,但出于其他原因我想暂时远离它们。这种方法在速度方面可行吗?如果数据库需要检查所有 O(30n) 行,其中 n 是用户数,我是否高估了索引的功能?
【问题讨论】:
-
为什么要使用
_n列来表示应该在行中的可变数量的数据? -
(关于您编辑的问题)那更好..现在您的性能测试显示了什么?如果您的服务器是奔腾 4,win98 在 CF 卡上作为硬盘,我们不能保证它会在
-
请注意,没有 ORDER BY 的 LIMIT 是毫无意义的
-
Big-O 表示法仅在谈论算法时才有意义,而不是数据大小。只需说您有大约 100M 行(最接近 10 的幂即可,向上取整),为我们提供数据集大小的示例。
-
"用户只需要感觉得到很好的照顾。" -- 是的!
标签: mysql sql database database-design