2016-12-15 86 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指标