首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释查询- MySQL不使用表中的索引

问解释查询- MySQL不使用表中的索引
EN

Stack Overflow用户
提问于 2015-07-02 11:14:52
回答 3查看 1.2K关注 0票数 0

我试图在explain中学习MySQL语句,但却碰壁了。

在我的实验中,我创建了两个表(每个表有10行),并通过一个简单的join运行explain。自然,不使用索引,扫描10*10 = 100行(我在图像中添加了输出,因为EXPLAIN的很长的输出被包装在自己身上。代码也在这个巴斯泰尔中):

​

​

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

​

​

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-02 20:14:49

您似乎在询问有关EXPLAIN、INDEXing和优化特定SELECTs的内容。

为此:

代码语言:javascript
复制
select  u.name
    from  users as u
    join  accounts as a on u.id = a.user_id
    where  a.amount > 1000;

优化器将在users和accounts之间选择首先查看哪个表。然后,它会反复延伸到另一张桌子上。

  1. 因为您说的是a.amount > ...,而不是u,所以优化器很可能首先选择a。
  2. 如果a.amount > 1000具有足够的选择性(例如,少于行的20% ),并且存在INDEX(amount),那么它将使用该索引。否则,它将对a进行表格扫描。
  3. 要进入u,需要一些以id开头的索引。请记住,PRIMARY KEY是一个索引。

这一点,以及更多的基础知识,在我的索引食谱中都有介绍。

有关黏液痛的讨论,请参见EXPLAIN。

请使用SHOW CREATE TABLE;它比DESCRIBE更具描述性。

EXPLAIN FORMAT=JSON SELECT...也有点神秘,但它确实比普通的EXPLAIN有更多的细节。

票数 2
EN

Stack Overflow用户

发布于 2015-07-02 11:24:49

这是一个有点长的评论。

基本上,你的桌子太小了。对于如此小的数据,您无法获得合理的性能指示--查询只需要将两个数据页加载到查询的内存中。嵌套循环联接需要100个比较。相比之下,加载索引和执行二进制搜索可能是相同的工作量,如果不是更多的话。

如果您想了解explain,那么使用几行数千万行的表。

票数 3
EN

Stack Overflow用户

发布于 2015-07-02 11:39:22

由于主过滤器有Because >‘>比较运算符,所以它会进行全表扫描,因为它可能返回或不返回所有行.

当您用'user_id‘列加入'accounts’表时,它会在可能的键中显示'user_id‘索引,但由于整个表扫描过程,它不会使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31183047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档