0

我有一个包含 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 上有一个全文索引NameTable3是一个拥有 30+ 百万条记录(大约 10gb)的记录。将它放在一张表中或将其拆分会大大提高性能吗?我还缺少其他东西?或者是 60+ 百万条记录很大以获得对全文搜索的快速响应?

4

1 回答 1

0

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

如果您总是查询所有表并且您主要进行读取,那么我很确定使用一张大表会更快。

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

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

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

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

于 2013-01-10T21:47:20.550 回答