2017-10-12 38 views
0

我有兩個相同的數據庫db1,分別是表名爲product1和db2的表名分別爲product2。用列說ID,名稱,兩個表的價格。來自多個數據庫的快速查詢方式

我在db1 product1表中存儲了價格低於500的產品,並且在db2 product2表中存儲了價格高於500的產品。

現在我需要合併兩個數據庫的結果並按名稱排序。我在MYSQL中使用了以下SQL查詢。

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 

它工作正常,我希望它花費的時間比預期的更多。

是否有任何其他最快的方式來完成這項工作?

感謝您爲寶貴的時間。

+0

爲什麼你有這樣一個愚蠢的系統? – Strawberry

回答

1

是否有任何其他最快的方式來完成這項工作?

一般不這樣做。把所有東西放到一個設計良好的數據庫中有些案例需要特殊處理,但單個數據庫是最好的入門方法。

如果您確定存在性能問題,您可以查看分區。即使那樣,它通常比一般的表演更有用,但它具有特定的好處。

我們大多數人都不會在需要任何類似雙重數據庫的性能的數據上工作。我會專注於首先製作一個正確的單個實例。 (即單數據庫,單表)

具體儘管,沿着這些線路結構化查詢可以提高性能

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 

這樣你只要求最低每DB的。

+0

我的服務提供商Godaddy不允許我創建大小超過1 GB的數據庫。很遺憾,我必須這樣做(創建多個數據庫)。這使我的執行時間從2秒縮短到了10秒。 –

+0

那麼你可能會選擇一個滿足你需求的技術提供商,而不是試圖混搭你的需求來匹配可用的技術。這很少結束。 – LoztInSpace

+0

確實創建視圖會幫助我嗎? –

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用戶可以訪問這兩個數據庫,並且它們位於同一主機上(即兩個數據庫都可以從SAM訪問您可以:

  1. 保持一個連接打開並根據需要調用mysql_select_db()在 之間進行交換。我不確定這是一個乾淨的解決方案,你可以結束查詢錯誤的數據庫。
  2. 當您在您的 查詢中引用表時指定數據庫名稱(例如,SELECT * FROM database2.tablename)。這很可能是 實施起來很痛苦。

另外請閱讀troelskn的答案,因爲如果您能夠使用PDO而不是較舊的擴展,這是一種更好的方法。