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

时间:2015-07-02 11:14:52

标签: mysql indexing

我试图在MySQL中学习explain语句但遇到了问题。

对于我的实验,我创建了两个表(每个表有10行)并在简单连接上运行explain。当然,没有使用任何索引,并且扫描了10 * 10 = 100行(我已经在图像中添加了输出,因为EXPLAIN的输出非常长,而且代码也在this pastebin) :

Bad table design

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

enter image description here

但正如您所看到的,MySQL仍在完全扫描用户表,就好像没有主键一样。出了什么问题?

3 个答案:

答案 0 :(得分:2)

评论时间有点长。

基本上,你的桌子太小了。您无法在这样的小数据上获得合理的性能指标 - 查询只需要将两个数据页加载到内存中以进行查询。嵌套循环连接需要100次比较。相比之下,加载索引和进行二进制搜索可能大致相同,即使不是更多。

如果您想了解explain,请使用包含数万行的表格。

答案 1 :(得分:2)

您似乎在询问switchEXPLAIN和优化特定INDEXing

为此:

SELECTs

优化程序将在select u.name from users as u join accounts as a on u.id = a.user_id where a.amount > 1000; users之间进行选择,以便首先查看哪个表。然后它会反复到达另一张表。

  1. 由于您说accountsa.amount > ...没有提及,优化程序很可能首先选择u

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

  3. 要进入a,需要一些以u开头的索引。请注意,id 是一个索引。

  4. my index cookbook中介绍了这个以及更多基础知识。

    有关PRIMARY KEY的讨论,请参阅myxlpain

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

    DESCRIBE也有点神秘,但它确实比常规EXPLAIN FORMAT=JSON SELECT...有更多细节。

答案 2 :(得分:1)

阱, 由于您的主过滤器有'>'比较运算符,它执行全表扫描因为它可能会也可能不会返回所有行。

当您加入'帐户'表' user_id'列,它显示' user_id'可能键中的索引,但它没有使用它,因为FULL TABLE SCAN过程。