簡體   English   中英

查詢超過3個表時,左連接性能太慢

[英]Left Join performance is too slow when query more then 3 tables

我需要查詢7個表,每個表都有district_id (區域有自己的id作為id,它是自動增量字段)。

表名是:

districts, blocks, panchayats, habitations, villages, divisions, sub_divisions

這是我用於測試的查詢語法。

SELECT 
d.id, d.district_name, 
COUNT(DISTINCT b.id) AS total_block, 
COUNT(DISTINCT g.id) AS gp_total,
COUNT(DISTINCT v.id) AS vi_total,
COUNT(DISTINCT h.id) AS h_total
FROM districts d 
LEFT JOIN blocks b ON b.district_id = d.id
LEFT JOIN panchayats g ON g.district_id = d.id
LEFT JOIN villages v ON v.district_id = d.id
LEFT JOIN habitations h ON h.district_id = d.id
GROUP BY district_name

它工作正常,直到3左連接,但到第四個它運行查詢但永遠不會停止。

目標 :我嘗試解析所有區域並從塊,panchayats,居住地,村庄,分區和子分區獲取所有匹配的district_id計數數據。

期待結果

districts | blocks | panchayats | habitations | villages | division | sub_divisions
-----------------------------------------------------------------------------------
ABC       | 6      | 20         | 10          | 10       | 3         | 2
-----------------------------------------------------------------------------------
DEF       | 3      | 12         | 4           | 7        | 7         | 4

我對SQL不太滿意,請提前感謝您的時間和幫助。

表結構:

Districts
------------------------------------------------------------------------------
id | district_name | district_code | last_update(TIMESTAMP) | created_on(DATE)
------------------------------------------------------------------------------

Blocks 
------------------------------------------------------------------------------
id | block_name | block_code | district_id | last_update | created_on
------------------------------------------------------------------------------

Panchayats
------------------------------------------------------------------------------
id | panchayat_name | panchayat_code | district_id | block_id | last_update | created_on
------------------------------------------------------------------------------

Habitations 
------------------------------------------------------------------------------
id  |  name  |  code  |  district_id  |  block_id  |  panchayat_id | village_id
------------------------------------------------------------------------------

Villages
------------------------------------------------------------------------------
id |  village_name  |  village_code  |  district_id  |  block_id | panchayat_id 
------------------------------------------------------------------------------

Division
------------------------------------------------------------------------------
id | name | district_id .....
------------------------------------------------------------------------------

Sub Division
------------------------------------------------------------------------------
id | name | district_id
------------------------------------------------------------------------------

所有的ID是主鍵,在phpMyAdmin我做district_id每個表中的索引。

您擁有它的查詢可能會創建一個巨大的結果集,然后對該結果集應用4個不同的不同計數。 在這種情況下,您可能最好使用子查詢。 不可否認,也不是一個很好的解決方案......

SELECT
    d.id,
    d.district_name,
    (SELECT COUNT(b.id) FROM blocks b WHERE b.district_id = d.id) total_block,
    (SELECT COUNT(p.id) FROM panchayats p WHERE p.district_id = d.id) gp_total,
    (SELECT COUNT(v.id) FROM villages v WHERE v.district_id = d.id) vi_total,
    (SELECT COUNT(h.id) FROM habitations h WHERE h.district_id = d.id) h_total
FROM districts d

你試過了嗎:

GROUP BY d.id, d.district_name

在您的原始查詢?

我認為MySQL允許以你所做的方式編寫GROUP BY ,但是其他數據庫不會以這種方式編寫它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM