2017-02-19 133 views
0

我有一些困難來完成任務。左連接需要很長的時間在150 000行

這裏是orders表中的一些數據:

+----+---------+ 
| id | bill_id | 
+----+---------+ 
| 3 |  1 | 
| 9 |  3 | 
| 10 |  4 | 
| 15 |  6 | 
+----+---------+ 

這裏是從bills表中的一些數據:

+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
+----+ 

我想列出所有bills是有關聯的order

爲了實現這一目標,我認爲使用的LEFT JOIN被挪用,所以我寫了這個請求:

SELECT * FROM bills 
    LEFT JOIN orders 
    ON bills.id = orders.bill_id 
WHERE orders.bill_id IS NULL; 

我還以爲我有以下結果:

+----------+-----------+----------------+ 
| bills.id | orders.id | orders.bill_id | 
+----------+-----------+----------------+ 
|  2 | NULL  | NULL   | 
|  5 | NULL  | NULL   | 
+----------+-----------+----------------+ 

但是我無法完成請求,它已經運行超過5分鐘而沒有結果,我停止了請求,因爲無論如何這都不是生產時間。

我的真實數據集有超過150 000 orders和100 000 bills。數據集是否太大?

我的請求在某處出錯了嗎?

非常感謝您的提示!

編輯:側面說明,表中沒有定義外鍵... *飛走了*

回答

2

您所查詢的是罰款。我會用表的別名在寫它:

SELECT b.* 
FROM bills b LEFT JOIN 
    orders o 
    ON b.id = o.bill_id 
WHERE o.bill_id IS NULL; 

你不從orders需要NULL列,大概。

你需要orders(bill_id)索引:

create index idx_orders_billid on orders(bill_id); 
+0

我認爲這將是解決方案...問題是,'訂單'表實際上充滿了'bill_id' = 0,我剛剛意識到數據庫完全不健康......感謝您的迴應,但我最後用一個hacky的PHP腳本... – Hammerbot

+0

@Gordon Linoff只是想學習...這裏使用表別名的目的是什麼?這有助於優化嗎? – watermelon

+0

@watermelon。 。 。當查詢有多個表時,我總是使用表別名。只有一張桌子時,只能省略它們,因爲我可能很懶。 –

0

通過你的where語句,我假設你在尋找有沒有票據的訂單。

如果是這種情況,您不需要按照定義不存在的方式加入賬單表。

你會發現

SELECT * FROM orders 
WHERE orders.bill_id IS NULL; 

一個更好的執行查詢。

編輯:

對不起,我錯過了你的「我要列出所有不具有關聯順序的賬單。」在閱讀問題時。正如@戈登指出的那樣,索引肯定會有所幫助。然而,如果改變方案是可行的,我寧願有一個可爲空的bill.order_id列而不是一個訂單。bill_id,因爲你不需要左連接,內連接就足以獲得訂單賬單,因爲它可以更快地查詢你的其他假定需求。

相關問題