2013-01-10 65 views
0

我有一个拥有6000万条记录的数据库。目前的设置是有一张桌子,有三千万以上的桌子和一个小桌子,每个桌子有五百万(ish)。每个表的数据结构都是相同的。第一次创建我们的搜索的人(3-4年前我在这里)使用了多个小桌子。我们为每个连接使用match against。我的老板和他的印象是,使用多个表让MySQL可以同时搜索每个表。在我读到的所有内容中,每个人都说一张大桌子会更好,但随着3000万张桌子变得更大,它有时会显着减速40+秒。这比它应该慢吗?MySQL全文表格结构

的选择statment

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和存在于山坳Name全文索引。 Table3是有3000万条记录(约10GB)的记录。将它放在一张桌子上或分开它会使性能增加很多?我错过了别的东西?或者是6000万条记录大到全文搜索得到快速响应?

+0

只需花费几分钟llars并在服务器中放置另一个RAM棒。如果整个活动数据集合在内存中,那么将其分区到磁盘上并不重要。 –

+0

你是否同时运行你的查询?如果是这样,多个表_可能会更快,但这取决于您正在运行的硬件类型。 –

回答

0

第一个小记事。没有其他真正的答案,除了“改变尝试”。这就是说,

如果你总是查询你所有的表格,你大部分都是读取,我很确定使用一个大表格会更快。

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

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

但是,如果你能确定哪些表可能可能返回结果,只是另外,如果你可以把查询放在你的应用程序中,并行地执行它们并在MySQL之外建立连接,那么你可以使用它们来获得大量的分裂它们也可以这样做partitioning

获得一些成绩,但是再次,你需要尝试去衡量真正的知道。

+0

谢谢!是否有变量来确定它将开始将数据写入驱动器的大小,而不是将其保存在温度中 – briandonor

+0

是的,您应该阅读http://dev.mysql.com/doc/refman/5.5/en /internal-temporary-tables.html文章,它很短,列出了这两个变量以及如何检查磁盘上是否创建了新的临时表。 –