使用相同的模式查询数千个MySQL数据库

时间:2011-10-28 06:31:13

标签: mysql database scalability

我有一个问题,过去几个月我一直在摸不着头脑。我在同一台服务器上有数万的MySQL数据库,都具有相同的架构。我希望能够查询所有这些并获得结果列表。目前,我使用PHP脚本遍历每个数据库并对每个数据库执行查询。有时这可能需要很长时间(10分钟以上),因此它显然不是最佳解决方案。

以下是我想要做的一个例子:

SELECT something FROM db_prefix_*.tablename WHERE something = 1;

...让它返回一组结果,db_prefix_ *是数据库的名称。

这样的事情是存在还是我在梦想?

这个问题可能会变得更加复杂,因为我将把这些数据库移到多个服务器上,但是当我到达那里时我会越过那条路。

4 个答案:

答案 0 :(得分:1)

这是你正在寻找的东西:

DECLARE @sqlQuery nvarchar(MAX)
SET @sqlQuery=''
select @sqlQuery=@sqlQuery+'select something from '+ SCHEMA_NAME  +'.tableName' from INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME LIKE 'db_prefix_%'
print @sqlQuery
EXEC sp_executeSQL @sqlQuery

我来自SQL服务器背景,我尽力翻译MySQL,请纠正我,如果这里的内容不正确。

答案 1 :(得分:1)

为什么不永久合并数据库,只需添加一个额外的列来指示它最初来自哪个数据库?我真的不明白为什么你会有这么多单独的数据库,如果它们之间的数据数据在某种程度上是有意义的。如有必要,请考虑一个可以像这样扩展的不同数据库。

答案 2 :(得分:0)

你可以尝试Parallel::ForkManager,它为perl提供了“一个简单的并行处理fork管理器”。

您可以根据查询的重量来上下调整最大进程数,并使用nice / ionice来防止对服务器造成过度压力。

只要您拥有0.7.6或更高版本,就可以将数据结构传递回父进程,这样您就可以对结果进行后处理(例如显示摘要)。

答案 3 :(得分:0)

简短的回答是否定的:所有的php mysql驱动程序(afaik)都独立地处理与数据库的连接,正如您已经通过迭代它们所做的那样。即使有一些驱动程序允许你想要的语法,我很确定它仍然会在某个级别为每个数据库创建一个新连接,因为mysql本身。

答案很长:您可以在多个数据库之间构建索引。跨多个dbs具有相同的模式实质上是分片,因此这是一个已知问题(尽管主键非唯一性可能是一个问题)。如果在多个数据库中的something上创建索引,则可能能够获得实时性能,尤其是在您只需要索引字段的值时。 Twitter早期报告了跨越mysql表的索引成功(http://engineering.twitter.com/2011/05/engineering-behind-twitters-new-search.html)所以有一个令人鼓舞的先例。与PHP社区(http://planet.mysql.com/?tag_search=2013)相比,在Rails社区中分片mysql(可以说)更有效率,所以你可能会在那里找到一些指示。

最近,面对类似规模的问题,我们只是简单地跳到了Mongo。