无法理解如何在基本的 MYSQL 解释示例中摆脱表扫描
Posted
技术标签:
【中文标题】无法理解如何在基本的 MYSQL 解释示例中摆脱表扫描【英文标题】:Trouble understanding how to get rid of a table scan in a basic MYSQL explain example 【发布时间】:2015-09-02 22:41:14 【问题描述】:我正在尝试优化一个非常基本的 mysql 示例,但我似乎无法弄清楚如何在引用列 uid 时阻止以下查询进行表扫描。使用 explain,tt 正确显示了一个可能的键,但实际上并未使用该键并扫描所有行。
CREATE TABLE `Foo` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`barId` int(10) unsigned NOT NULL,
`uid` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `barId` (`barId`),
KEY `uid` (`uid`)
)
explain
select count(uid) as userCount
FROM Foo
WHERE barId = 1
GROUP BY barId
id select_type table type possible_keys key rows Extra
1 SIMPLE Foo ALL barId NULL 4 Using where
样本数据
id,barId,uid
1,1,1
2,1,2
3,1,3
4,2,4
【问题讨论】:
GROUP BY
不需要 barID = 1
当然...但是在没有它的情况下仍然进行表扫描。
【参考方案1】:
看起来 MySQL 很聪明,并且意识到在这么小的表上使用索引需要更多时间?
当我解释它为空时,键是“barId”。 有 4 行(您的 样本数据),键为 NULL。 有 4096 行(我运行 INSERT SELECT 到 本身几次),键返回到“barID”。来自bottom的手册。
索引对于小表或大表的查询不太重要 报表查询处理大部分或所有行的位置。当一个查询 需要访问大部分行,顺序读取比 通过索引工作。顺序读取最小化磁盘寻道,甚至 如果查询不需要所有行。
【讨论】:
以上是关于无法理解如何在基本的 MYSQL 解释示例中摆脱表扫描的主要内容,如果未能解决你的问题,请参考以下文章
MySQL错误1093 - 无法在FROM子句中指定更新的目标表