【问题标题】:MySQL full text table structureMySQL全文表结构
【发布时间】:2012-12-25 10:04:16
【问题描述】:

我有一个包含超过 6000 万条记录的数据库。目前的设置是有 1 张桌子有 30+ 百万和几个小桌子,每张桌子有 500 万(ish)。每个表的数据结构都是相同的。第一次创建我们搜索的人(在我来到这里之前的 3-4 年前)使用了多个小桌子。我们为每个连接使用match against。我的老板和他的印象是,使用多个表可以让 MySQL 同时搜索每个表。在我读到的所有内容中,每个人都说一张大桌子会更好,但随着 30 多万张桌子变大,它的速度似乎会显着放缓,有时需要 40 多秒。这比应该的慢吗?

选择语句

SELECT $stuff FROM table1 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table2 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table3 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table4 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table5 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table6 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table7 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table8 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table9 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table10 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE)

这些表是 MyISAM 并且在 col Name 上有一个全文索引。 Table3 是拥有 30+ 百万条记录(约 10GB)的记录。将它放在一个表中或将其拆分会大大提高性能吗?我还缺少其他东西?或者是 60+ 百万条记录需要在全文搜索中获得快速响应?

【问题讨论】:

  • 只要花几块钱,在服务器上再放一块内存。如果整个活动数据集都适合内存,那么您如何在磁盘上对其进行分区并不重要。
  • 您是否同时运行查询?如果是这样,多个表可能会更快,但这实际上取决于您运行的硬件类型。

标签: mysql database full-text-search large-data-volumes


【解决方案1】:

先做个小笔记。除了“尝试改变它”之外,没有其他真正的答案。也就是说,

如果您总是查询所有表,并且主要进行读取操作,我敢肯定使用一张大表会更快。

使用联合(或联合全部)将始终将单个结果放在临时表中,如果该表足够大,它将在磁盘上创建。如果你有一张大表,你可以直接将结果返回给客户端。

如果你做了很多插入,如果你把它们放在一个较小的表中,它们会更快(因为要遍历的索引更小。

但是,如果您可以确定哪些表可能会返回结果并在查询中使用它们,那么您可以获得很多拆分它们的机会。这也可以通过partitioning 完成

此外,如果您可以将查询放入您的应用程序并并行执行它们并在 MySQL 外部进行连接,您可能会获得一些性能,但同样,您需要尝试和衡量才能真正了解。

【讨论】:

  • 谢谢!是否有一个变量可以找出它将开始将数据写入驱动器而不是将其保存在 temp 中的大小
  • 是的,你应该阅读这篇dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html 文章,它很短,列出了变量以及如何检查是否在磁盘上创建了新的临时表。
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2013-02-04
  • 1970-01-01
  • 2012-12-30
  • 2013-08-22
  • 1970-01-01
相关资源
最近更新 更多