我有多个表,第一个包含一个值,另一个应存在(如果存在),值和active
状态为一个:
Table 1
+------+-------+--------+
| id | value | active |
+------+-------+--------+
| 1 | v1 | 1 |
| 2 | v2 | 1 |
| 3 | v3 | 1 |
+------+-------+--------+
Table 2 Table 3
+------+-------+-------+--------+ +------+-------+-------+--------+
| id | link | value | active | | id | link | value | active |
+------+-------+-------+--------+ +------+-------+-------+--------+
| 1 | 1 | v21 | 1 | | 1 | 1 | v31 | 1 |
| 2 | 2 | v22 | 0 | | 2 | 2 | v32 | 1 |
| 3 | 3 | v23 | 1 | +------+-------+-------+--------+
+------+-------+-------+--------+
现在,我想将Table 1
扩展为包含Table 2
和Table 3
的值(如果有值且值为active=1
)。结果表应如下所示:
Result
+------+-------+-------+--------+
| id | value | tbl 2 | tbl 3 |
+------+-------+-------+--------+
| 1 | v1 | v21 | v31 | -- values exist in every table
| 2 | v2 | NULL | v32 | -- active is 0 in Table 2 -> value tbl 2 = NULL
| 3 | v3 | v23 | NULL | -- value does not exist in Table 3 -> value tbl 3 = NULL
+------+-------+-------+--------+
我尝试了查询
SELECT SQL_CALC_FOUND_ROWS
`Table 1`.*,
IF(`Table 2`.`active` = 1, `Table 2`.`value`, NULL) AS tbl2,
IF(`Table 3`.`active` = 1, `Table 3`.`value`, NULL) AS tbl3
FROM
`Table 1`
LEFT JOIN
`Table 2` ON `Table 1`.`id` = `Table 2`.`link`
LEFT JOIN
`Table 3` ON `Table 1`.`id` = `Table 3`.`link`
WHERE
`Table 1`.`active` = 1
LIMIT <limit> OFFSET <offset>
这有效并给出了预期的结果。但是放入SQL_CALC_FOUND_ROWS
之后,需要花费很长时间。我的Table 1
有2000多个值,而且我不仅要加入Table 2
和Table 3
,还要加入另外10个表。他们也有2000多个记录。
我在link
列和Table 1.id
列上都有一个索引。
如何加快查询速度?这是最快的方法吗?
我想知道,因为我没想到MYSQL在2000行时会出现性能问题。但是我在MYSQL方面并不出色,所以这可能是最糟糕的解决方案。
答案 0 :(得分:1)
您可以尝试以下方法:
Arel