2010-10-21 46 views
1

編輯:所以查詢確實有效,但在我的本地主機上運行花了一分鐘。無可否認,我的本地主機上的表格(每個表格大約有8000行)相當大,但在生產中,表格每個可以有25,000行以上。有沒有什麼辦法可以優化這個,所以不需要太長時間?正如其中一條評論所指出的那樣,兩個表都被編入索引。爲什麼這會在phpMyAdmin中拒絕完成外連接查詢?

我有兩個表,jos_eimcart_customers_addresses和jos_eimcart_customers。我想從客戶表中提取所有記錄,並在地址表中包含可用的地址信息。我有我認爲是一個相當普通的左外連接查詢,但它保持超時在phpMyAdmin,即使沒有那麼多結果應該找到。任何人都可以指出我是否做錯了什麼?我沒有收到mySQL錯誤。

select 
    c.firstname, 
    c.lastname, 
    c.email as customer_email, 
    a.email as address_email, 
    c.phone as customer_phone, 
    a.phone as address_phone, 
    a.company, 
    a.address1, 
    a.address2, 
    a.city, 
    a.state,a.zip, 
    c.last_signin 
from jos_eimcart_customers c 
    left outer join jos_eimcart_customers_addresses a 
    on c.id = a.customer_id 
order by c.last_signin desc 
+0

哪些表的大小(行)?有沒有索引? – JoshD 2010-10-21 19:33:34

+0

兩者都被編入索引,並且兩個表都沒有超過100行。 – EmmyS 2010-10-21 19:37:28

+0

看起來這個查詢實際上已經崩潰了我們的數據庫服務器,即使它處理了已經索引的非常小的表。我有更復雜的查詢運行在更大的表上,所以這個特定的表有什麼問題? – EmmyS 2010-10-21 19:46:18

回答

0

你的查詢沒有錯(假設計數正如你所說的那樣)。你的服務器上還有其他的東西正在發生。

它有什麼機會等着鎖?

+0

我不這麼認爲;我怎麼知道? – EmmyS 2010-10-21 20:45:40

+0

在運行時運行「顯示進程列表」。 你可以看到你的查詢在做什麼(發送數據,鎖定等)。 – ceteras 2010-10-25 08:40:25

+0

我不認爲我可以在phpMyAdmin中做到這一點,這是我對服務器的唯一訪問權限。 – EmmyS 2010-10-25 17:16:39

4

你需要一個group by子句:

SELECT 
    c.firstname, 
    c.lastname, 
    c.email AS customer_email, 
    a.email AS address_email, 
    c.phone AS customer_phone, 
    a.phone AS address_phone, 
    a.company, 
    a.address1, 
    a.address2, 
    a.city, 
    a.state, 
    a.zip, 
    c.last_signin 
FROM jos_eimcart_customers c 
LEFT OUTER JOIN jos_eimcart_customers_addresses a ON c.id = a.customer_id 
GROUP BY 
    c.firstname, 
    c.lastname, 
    c.email AS customer_email, 
    a.email AS address_email, 
    c.phone AS customer_phone, 
    a.phone AS address_phone, 
    a.company, 
    a.address1, 
    a.address2, 
    a.city, 
    a.state, 
    a.zip, 
    c.last_signin 
ORDER BY c.last_signin DESC 
相關問題