2016-12-15 155 views
0

以下哪種查詢風格對性能更好?MySQL性能 - LEFT JOIN/HAVING與子查詢

基本上,我使用GROUP_CONCAT將許多相關記錄返回到一行,並且需要通過GROUP_CONCAT值上的另一個連接進行過濾,並且我需要按順序添加更多連接/ group_concats/havings或子查詢以更多相關值進行過濾。我正式看到,LEFT JOIN速度更快,但我想知道GROUP_CONCAT和HAVING是否通過了。

(這是一個非常簡單的例子,實際的數據有更多的屬性和它是從一個Drupal的MySQL架構讀)

謝謝!

Main Records 
+----+-----------------+----------------+-----------+-----------+ 
| id | other_record_id | value   | type  | attribute | 
+----+-----------------+----------------+-----------+-----------+ 
| 1 |    0 | Red Building | building |   | 
| 2 |    1 | ACME Plumbing | attribute | company | 
| 3 |    1 | east_side  | attribute | location | 
| 4 |    0 | Green Building | building |   | 
| 5 |    4 | AJAX Heating | attribute | company | 
| 6 |    4 | west_side  | attribute | location | 
| 7 |    0 | Blue Building | building |   | 
| 8 |    7 | ZZZ Mattresses | attribute | company | 
| 9 |    7 | south_side  | attribute | location | 
+----+-----------------+----------------+-----------+-----------+ 

location_transaltions 
+-------------+------------+ 
| location_id | value  | 
+-------------+------------+ 
|   1 | east_side | 
|   2 | west_side | 
|   3 | south_side | 
+-------------+------------+ 

locations 
+----+--------------------+ 
| id | name    | 
+----+--------------------+ 
| 1 | Arts District  | 
| 2 | Warehouse District | 
| 3 | Suburb    | 
+----+--------------------+ 

查詢#1

SELECT 
    a.id, 
    GROUP_CONCAT(
     IF(b.attribute = 'company', b.value, NULL) 
    ) AS company_value, 
    GROUP_CONCAT(
     IF(b.attribute = 'location', b.value, NULL) 
    ) AS location_value, 
    GROUP_CONCAT(
     IF(b.attribute = 'location', lt.location_id, NULL) 
    ) AS location_id  
FROM 
records a 
LEFT JOIN records b ON b.other_record_id = a.id AND b.type = 'attribute' 
LEFT JOIN location_translations lt ON lt.value = b.value 
WHERE a.type = 'building' 
GROUP BY a.id 
HAVING location_id = 2 

查詢#2

SELECT temp.* FROM (
    SELECT 
     a.id, 
     GROUP_CONCAT(
      IF(b.attribute = 'company', b.value, NULL) 
     ) AS company_value, 
     GROUP_CONCAT(
      IF(b.attribute = 'location', b.value, NULL) 
     ) AS location_value 
    FROM 
    records a 
    LEFT JOIN records b ON b.other_record_id = a.id AND b.type = 'attribute' 
    WHERE a.type = 'building' 
    GROUP BY a.id 
) as temp 
LEFT JOIN location_translations lt ON lt.value = temp.location_value 
WHERE location_id = 2 

回答

0

使用連接在大多數情況下最好的,因爲它有助於優化了解哪些指標,他可以使用。在你的情況下,查詢#1看起來不錯。
當然,它只適用於表有索引。檢查表recordsvalue

idother_record_idvaluetype列,表 location_translations指標