【发布时间】:2015-05-23 23:31:29
【问题描述】:
玩着一个mysql,想着以后怎么解决一件事。我想检索由我的朋友(特定用户 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
结果:
问题一:
不应该是额外的角色:“使用索引”而不是“哪里”?
问题二:
为什么响应时间这么慢? 2.3s
在蒂姆回答后编辑:
- 我猜在使用 union no 时文件排序行为是正常的?
- 为什么在解释的第二行中有'using where'?如果第三个是“使用哪里,使用索引”?
- 如果选择返回多少行,您认为这会变慢?
联合选择似乎超级快,但目前只有几行返回每个选择。我将尝试在每个选择中选择更多行。
【问题讨论】:
-
文件排序可能是status列造成的,定义为Text。
-
s.id = gs.id让我的大脑开始旋转!为什么你有一个状态的 id 和一个组状态的 id;此外,为什么它们具有相同的语义(因为您正在加入它们)?? -
Rick 你的命名建议是什么?你对这个问题本身有什么要说的吗?
标签: mysql performance sql-execution-plan