json - 搜索自动完成用户名 : Is it better to query DB ONCE for all users, 或在每次击键时多次查询 'users like' ?

标签 json node.js database search sequelize.js

我正在使用 Node/快速后端,并在前端使用 angular。我有一个功能,用户可以搜索其他用户添加为 friend 。我的问题是哪种方法更便宜。为了便于论证,让我们假设有 100 万个用户帐户。

1) 当您在用户搜索字段中输入第一个按键时,会执行数据库查询以查找用户名以该字母开头的每个用户,然后服务器以整个 json 文件进行响应,然后您向该端点发出 get 请求你的 Angular 前端。每个连续输入的字母将不再进行数据库查询,而是利用浏览器内存中的巨大 json 数组并将用户作为自动完成的建议。

或者

2) 用户名​​的长度必须至少为 6 个字符。一旦您输入了 6 个字符(显着减少了数据库查询用户名的可能性),db 查询就完成了,并且用户名与您键入的查询的用户名相似的整个 json 文件将作为响应发送。从那时起,输入的每个连续字母都将过滤自动完成。

或者

3) 与数字 2 相同,但是,不是在 6 个键入的字符后发送单个巨大的 JSON 对象,键入的每个新的连续字母将执行一个新的、较小的 db 查询,专门针对查找具有您键入的确切字符串的数据库条目.基本上在角度上是一个“变化时”的听众。即,Johnny 将返回一个所有用户名都以 Johnny 开头的对象,但是,当我输入 Johnny1 时,现在只有 Johnny1 用户对象将作为数据库查询被搜索,如果存在,则作为响应返回。然后 Johnny12 将为 Johnny12 的确切字符串(当然是小写)做一个 DB 查询......等等。

这些方法哪个更便宜?对整个数据库执行单个庞大的数据库查询并将其发送一次并将其保存在前端内存中是否更昂贵?或者在每次敲击时进行许多小查询,只返回一小部分数据,但允许有更多机会使 100 万用户规模的服务器崩溃,每个用户每次按下按键时都执行一个请求?

谢谢。

最佳答案

您的数据库将成为此答案的驱动力。你用的是什么数据库?如果使用 SQL 数据库,请确保 username 字段已编入索引。无论是哪种数据库,将数据库结构发挥到最大优势都会比界面更能驱动这个答案。像 elasticsearch (可用作 AWS service )这样的数据库将是(几乎)实时响应,所以每个字母都要做。

您在初始搜索中包含的字母越多,您的可能响应树肯定会缩小。在第一次查询之前获得两个或三个首字母将大大有助于减少产生的有效负载。

缓存这些初始搜索值也很方便。缓存数据库(Redis、MemCache)会很不错,但即使只是将这些结果存储在您的实例上也有助于减少通过该实例的 future 查询的延迟(可能应该以某种方式使它们过期,否则缓存的数据将从用户那里变得陈旧) DB,或者每个实例都必须监听添加/删除的用户以更新他们的 chaches)。

最后一个想法。在您的客户端添加一些“去抖动”,这样您就不会查询每个按键,而是给用户一些时间来完成输入。这将减轻您的数据库的负载,并减少您在客户端上处理的查询量。

关于json - 搜索自动完成用户名 : Is it better to query DB ONCE for all users, 或在每次击键时多次查询 'users like' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39575796/

相关文章:

node.js - gulpfile 只用 watch 运行一次

database - 在哪里存储和检索 Google Cloud Functions API 的数据?

c++ - 高效更新多条记录的 SQLite 表

java - Jersey:JSON 和 StringMessageProvider 冲突,application/json 方法生成无效的 JSON

javascript - 如何在 JavaScript 中为 D3 构建数据集?

node.js - Apache ProxyPass 和 Node.js - 不提供 socket.io

node.js - 带有限制选项的僧侣排序

database - SQL Server 2008 问题上的全文搜索实现

javascript - Dygraphs.js 未显示第二个值

java - 哪些 Java JSON 库可以很好地重用 JAXB 注释?