解释查询 - MySQL 未使用来自 table 的索引

Explain query - MySQL not using index from table

我正在尝试学习 MySQL 中的 explain 语句,但 运行 撞墙了。

对于我的实验,我通过简单的连接创建了两个 table(每个有 10 行)和 运行 explain。当然,没有使用索引,扫描了 10*10 = 100 行(我在图像中添加了输出,因为 EXPLAIN 的很长的输出被包裹在自身上。代码也在 this pastebin 中):

然后我添加了主键和索引并重新发出 explain 命令:

但是如您所见,用户 table 仍在被 MySQL 完全扫描,就好像没有主键一样。出了什么问题?

评论有点长

基本上,您的桌子太小了。您无法在如此小的数据上获得合理的性能指示——查询只需要将两个数据页加载到内存中以供查询。嵌套循环连接需要 100 次比较。相比之下,加载索引和进行二分查找的工作量可能差不多,甚至更多。

如果你想感受一下explain,那就用几万行的表吧。

嗯, 由于您的主过滤器具有“>”比较运算符,因此它会进行完整 table 扫描,因为它可能会也可能不会 return 所有行。

当您加入 'accounts' table 和 'user_id' 列时,它会在可能的键中显示 'user_id' 索引,但它不会使用它,因为完整 TABLE 扫描过程。

您似乎在询问 EXPLAININDEXing 和优化特定的 SELECTs

为此:

select  u.name
    from  users as u
    join  accounts as a on u.id = a.user_id
    where  a.amount > 1000;

优化器将在 usersaccounts 之间选择 table 首先查看。然后它会反复伸入另一个 table.

  1. 既然你说了a.amount > ...而没有说u,那么优化器很可能会先选择a

  2. 如果 a.amount > 1000 具有足够的选择性(少于 20% 的行) 则有 INDEX(amount),它将使用该索引。否则它将对 a.

  3. 进行 table 扫描
  4. 要进入 u,它需要一些以 id 开头的索引。请记住 PRIMARY KEY 一个索引。

my index cookbook.

中涵盖了这一点以及更多基础知识

有关 EXPLAIN 的讨论,另请参阅 myxlpain

请使用SHOW CREATE TABLE;它比 DESCRIBE.

更具描述性

EXPLAIN FORMAT=JSON SELECT... 也有点神秘,但它确实比常规 EXPLAIN.

有更多细节