我有一个大的User
表,有100多万行。奇怪的是它通常会查询大多数用户数据,但在查询某些用户数据时总是需要30秒。它并不是随机发生的,而是始终在特定的用户身上发生。
查询如下:
SELECT * FROM visit V
INNER JOIN group G ON G.id = V.group_id
INNER JOIN user U ON U.id = V.user_id AND U.group_id = V.parent_group_id
WHERE V.id = xxx AND V.group_id = xxx
但是如果我用表用户删除JOIN
,则查询再次正常。
有谁知道如何解决这个问题?
(查询缩小,实际查询很长,也需要保密)
答案 0 :(得分:2)
SELECT * FROM visit V
INNER JOIN group G ON G.id = V.group_id
INNER JOIN user U ON U.id = V.user_id AND U.group_id = V.parent_group_id
WHERE V.id = xxx AND V.group_id = xxx
为了使连接有效运行,必须将以下字段定义为这些表的索引:
V.group_id
V.user_id
V.parent_group_id
U.group_id
要使查询高效运行,不应使用SELECT *
(仅指定 所需的列),并且应优化查询
最终,您要求社区帮助您解决大型数据集上的MySQL性能问题,但不愿意或无法向我们展示任何表结构,完整查询或示例源数据和期望的输出。
只要我们失明,我们就无能为力。