gpt4 book ai didi

mysql解释慢在左侧连接表的位置

转载 作者:行者123 更新时间:2023-11-29 22:24:10 24 4
gpt4 key购买 nike

玩弄mysql,思考以后如何解决一件事。我想检索我的 friend (特定用户 ID)发布的状态或在我关注的群组内发布的状态。

CREATE TABLE `status` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`status` text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_F23501207E3C61F9` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1567559 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

CREATE TABLE `group_status` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_F23501207E3C61F9` (`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

我为两个表提供了 100 万行。

我正在运行的查询:

SELECT s.id, s.status, gs.group_id
FROM status s
LEFT JOIN group_status gs
ON s.id = gs.id
WHERE
s.user_id IN (55883,122024,442468,846269,903941,980896,192660,20608,525056,563457)
OR gs.group_id IN (78,79,79,80,80,83,84,85,86,87,88,89,89,91,92,92,94,98)
ORDER BY s.id DESC
LIMIT 15

结果:

enter image description here

问题一:

不应该是额外的角色,例如:“使用索引”而不是“where”?

问题二:

为什么响应时间这么慢? 2,3秒

enter image description here

在蒂姆回答后进行编辑:

enter image description here

  1. 我认为使用 union no 时文件排序行为是正常的?
  2. 为什么解释的第二行有“using where”?如果第三个是“使用哪里,使用索引”?
  3. 如果从 select 返回了多少行,您认为这会变慢?

联合选择似乎非常快,但当前只有很少的行返回每个选择。我将尝试在每个选择中选择更多行。

最佳答案

当你在不同的列上使用“OR”时,mysql 可能不会使用你的任何索引。

通常我们可以使用“UNION”两个单独的查询来解决问题,每个查询都匹配一个条件。

SELECT id, status, group_id FROM
(
SELECT s.id, s.status, gs.group_id
FROM status s
LEFT JOIN group_status gs
ON s.id = gs.id
WHERE
s.user_id IN (55883,122024,442468,846269,903941,980896,192660,20608,525056,563457)
UNION
SELECT s.id, s.status, gs.group_id
FROM status s
LEFT JOIN group_status gs
ON s.id = gs.id
WHERE
gs.group_id IN (78,79,79,80,80,83,84,85,86,87,88,89,89,91,92,92,94,98)
) t
ORDER BY id DESC
LIMIT 15

但是,就您的情况而言,如果任一查询返回大量记录,这可能没有帮助。

您的状态列被定义为文本,这可能会导致文件排序。您可以将其检查为 long varchar 以查看文件排序是否正常。或者尝试这样做以避免更糟糕的情况:

SELECT ss.id, group_id, ss.status 
FROM (
SELECT id, group_id FROM
(
SELECT s.id, gs.group_id
FROM status s
LEFT JOIN group_status gs
ON s.id = gs.id
WHERE
s.user_id IN (55883,122024,442468,846269,903941,980896,192660,20608,525056,563457)
UNION
SELECT s.id, gs.group_id
FROM status s
LEFT JOIN group_status gs
ON s.id = gs.id
WHERE
gs.group_id IN (78,79,79,80,80,83,84,85,86,87,88,89,89,91,92,92,94,98)
) t
ORDER BY id DESC
LIMIT 15
) f
JOIN status ss
ON f.id =ss.id
ORDER BY ss.id

关于mysql解释慢在左侧连接表的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com