从多个数据库

时间:2017-10-12 06:01:53

标签: mysql sql database

我有两个相同的数据库db1,表名为product1,db2分别为表名product2。使用列表示两个表的id,name,price。

我在db1 product1表中存储价格低于500的产品,在db2 product2表中存储价格超过500的产品。

现在我需要结合两个数据库的结果并按名称对其进行排序。我在MYSQL中使用了以下SQL Query。

   SELECT * FROM (SELECT id,name,price from db1.product1
                  UNION ALL  
                  SELECT id,name,price from db2.product2) AS DATA 
   ORDER BY DATA.name LIMIT 18

它对我来说很好,预计花费的时间比预期的要长。

还有其他最快的方法来完成这项工作吗?

感谢您浪费宝贵的时间。

2 个答案:

答案 0 :(得分:1)

  

有没有其他最快的方法来完成这项工作?

一般不要这样做。将所有内容放入一个精心设计的数据库中有些情况需要特殊处理,但单个DB是最好的起始方法。

如果您完全确定存在性能问题,可以查看分区。即使这样,它作为一种管理工具通常比一般性能工具更有用,尽管它具有特定的好处。

我们大多数人都不会处理需要双重数据库等性能的数据。我会先集中精力制作一个正确的单个实例。 (即单个DB,单个表)

具体而言,沿着这些行构建查询可能会提高性能

SELECT * FROM (
select * from (SELECT id,name,price from db1.product1    ORDER BY DATA.name LIMIT 18) as X
UNION ALL  
select * from (SELECT id,name,price from db2.product2    ORDER BY DATA.name LIMIT 18) as Y 
) AS DATA 
   ORDER BY DATA.name LIMIT 18

这样你只要求每个数据库的最小值。

答案 1 :(得分:0)

您可以对mysql_connect()进行多次调用,但如果参数相同,则需要为'$ new_link'(第四个)参数传递true,否则将重用相同的连接。例如:

$dbh1 = mysql_connect($hostname, $username, $password); 
$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1);
mysql_select_db('database2', $dbh2);

然后查询数据库1传递第一个链接标识符:

mysql_query('select * from tablename', $dbh1);

和数据库2传递第二个:

mysql_query('select * from tablename', $dbh2);

其他选项

如果MySQL用户可以访问两个数据库并且它们位于同一主机上(即两个数据库都可以从同一个连接访问),您可以:

  1. 保持一个连接打开,并调用mysql_select_db()进行交换 有必要的。我不确定这是一个干净的解决方案,你可以 最终查询错误的数据库。
  2. 在引用表中的表时指定数据库名称 查询(例如SELECT * FROM database2.tablename)。这很可能 实施起来很痛苦。
  3. 另请阅读troelskn的答案,因为如果您能够使用PDO而不是较旧的扩展程序,这是一种更好的方法。