无法理解如何在基本的 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 解释示例中摆脱表扫描的主要内容,如果未能解决你的问题,请参考以下文章

我如何摆脱 Python 中的全局变量?

MySQL错误1093 - 无法在FROM子句中指定更新的目标表

MySQL 在多个数据库中搜索价值

如何摆脱数据透视表中的总行和总列

React Router 无法读取未定义的 ToUpperCase ... 基本示例

连接两个表的工作查询是完美的,除了我无法摆脱重复项