V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  isora  ›  全部回复第 1 页 / 共 1 页
回复总数  5
171 天前
回复了 zcm3579 创建的主题 MySQL 请教 SQL 子查询的性能问题
在处理这种问题时,我们需要考虑到性能和查询结果的准确性。在你的例子中,方式 1 和方式 2 都有可能产生性能问题。

方式 1 中,你使用了子查询在 WHERE 子句中,这可能会导致查询性能下降,因为 MySQL 需要为每个外部查询的行执行子查询。如果你的表中有大量的数据,这可能会导致性能问题。

方式 2 中,你在 SELECT 子句中使用了子查询,这也可能会导致性能问题,因为 MySQL 需要为每个外部查询的行执行子查询。此外,这种方法可能会导致查询结果不准确,因为你在子查询中使用了 GROUP_CONCAT 函数,但没有 GROUP BY 子句。

一个可能的解决方案是使用 JOIN 而不是子查询。你可以尝试以下查询:

```sql
SELECT
u.id,
u.name,
GROUP_CONCAT(i.email) AS email,
GROUP_CONCAT(i.phone) AS phone
FROM user u
LEFT JOIN contact i ON u.id = i.ref_id
WHERE i.phone LIKE '%137%'
AND i.email LIKE '%abc.com%'
GROUP BY u.id;
```

这个查询将`contact`表连接到`user`表,并在`WHERE`子句中应用筛选条件。然后,它使用`GROUP BY`子句和`GROUP_CONCAT`函数来聚合结果。这种方法应该比使用子查询更有效率,因为 MySQL 只需要执行一次 JOIN 操作,而不是为每个外部查询的行执行子查询。

然而,这种方法可能会导致查询结果不准确,因为`WHERE`子句中的条件可能会过滤掉一些你想要在结果中看到的行。为了解决这个问题,你可以考虑使用`HAVING`子句来替代`WHERE`子句,如下所示:

```sql
SELECT
u.id,
u.name,
GROUP_CONCAT(i.email) AS email,
GROUP_CONCAT(i.phone) AS phone
FROM user u
LEFT JOIN contact i ON u.id = i.ref_id
GROUP BY u.id
HAVING email LIKE '%abc.com%'
AND phone LIKE '%137%';
```

这个查询首先执行 JOIN 操作和 GROUP BY 子句,然后在聚合结果上应用 HAVING 子句中的条件。这种方法应该能够提供你想要的结果,而且性能也比使用子查询更好。
20.8~32.8
2022-12-29 10:24:20 +08:00
回复了 1800x 创建的主题 数据库 sql 表设计问题:需索引的可选字段应该允许 null 吗?
2022-12-28 17:04:42 +08:00
回复了 monkeydev 创建的主题 分享发现 辉瑞新冠特效药 Paxlovid 组团代购
@laogoulucky 老哥怎么联系
蓝盾
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2655 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 16ms · UTC 03:02 · PVG 11:02 · LAX 19:02 · JFK 22:02
Developed with CodeLauncher
♥ Do have faith in what you're doing.