【发布时间】: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