mysql - 在 MySQL 中快速插入和搜索大号的最佳解决方案。行数?

标签 mysql performance hadoop

我们计划在我们的 Web 应用程序中实现一项功能,该功能将使用户能够进行搜索并将所有匹配记录的 ID 保存在数据库(MySQL - INNODB)中作为“列表”。结果可以是数百万。我们希望用户能够保存多达 100 万个 ID。它必须是实时的(最多 5-10 秒的延迟是可以接受的)。此列表稍后可以用作与现有过滤器结合的另一个过滤器。

我们不需要从客户端传递这些 ID,因为可以在服务器端进行相同的搜索来检索这些 ID。但是,稍后无法重复使用相同的搜索来获取这些 ID,因为搜索结果可能会发生变化。

我们有几千名活跃用户,预计不会有很多人创建这么大的列表,但随着时间的推移,总数不会。这些列表中保存的 ID 数量可以增长到数亿。

服务器的 RAM 比整个数据库(几百 GB)还多。它还使用SSD。

以下是我们需要解决的问题:

- Saving up to 1 million ids in DB (within few secs)
- Using these IDs as a search criteria with other filters (this additional criteria shouldn't slow down the searches by more than few secs)

这似乎是一些可能的解决方案:

解决方案一:

  • 有一个包含 User Id、List Id、Doc Id 的单独表
  • 将 ID 保存在单独的行中(1 个列表可能有 100 万行)
  • 一定大小后的分区表

好处:此表以后可以很容易地在 JOIN 条件中使用,并且索引搜索性能应该很快。

问题:插入会很慢 - 我知道有一些方法可以加快插入速度,但它仍然需要比几秒更长的时间,尤其是在表增长时。

解决方案 2:

  • 将所有 ID 保存在一行中
  • 使用 MapReduce 等技术将这些 ID 作为查询中的 IN 参数分块传递以进行快速搜索

好处:插入会非常快。

问题:使用 MapReduce 可以提高搜索性能,但它会给服务器带来大量负载,尤其是当许多用户开始进行此类搜索时。

关于什么是最好的方法有什么建议吗?是否有任何其他可能的方法来满足这种情况?

最佳答案

在渐进式过滤中保存中间结果——我从未见过它被成功使用过。只需构建完整的查询并每次都执行它。

关于mysql - 在 MySQL 中快速插入和搜索大号的最佳解决方案。行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30526744/

相关文章:

php - 使用 PDO 优化循环中的多个 MySQL 查询

mysql - 根据多列选择第二个表中不存在的行

c - 使用PACKET_MMAP和PACKET_TX_RING发送数据比 “normal”慢(无)

java - MapReduce中First Reduce Task作为<Key Value>对的输出值

hadoop - HBase shell "OutOfOrderScannerNextException"扫描器和计数调用错误

mysql - 如何使用 activerecord 在 JOIN 中指定 'USE INDEX'

python - 如何获取 SQL 查询的数量?

sql - 查询优化 - VARCHAR 相等与数字相等

javascript - jQuery .getJSON vs .post 哪个更快?

java - 如何从现有的 Web 应用程序访问 HDFS(Hadoop 文件系统)