我试图在MySQL中学习explain
语句但遇到了问题。
对于我的实验,我创建了两个表(每个表有10行)并在简单连接上运行explain
。当然,没有使用任何索引,并且扫描了10 * 10 = 100行(我已经在图像中添加了输出,因为EXPLAIN的输出非常长,而且代码也在this pastebin) :
然后我添加了主键和索引,并重新发布了explain
命令:
但正如您所看到的,MySQL仍在完全扫描用户表,就好像没有主键一样。出了什么问题?
答案 0 :(得分:2)
评论时间有点长。
基本上,你的桌子太小了。您无法在这样的小数据上获得合理的性能指标 - 查询只需要将两个数据页加载到内存中以进行查询。嵌套循环连接需要100次比较。相比之下,加载索引和进行二进制搜索可能大致相同,即使不是更多。
如果您想了解explain
,请使用包含数万行的表格。
答案 1 :(得分:2)
您似乎在询问switch
,EXPLAIN
和优化特定INDEXing
。
为此:
SELECTs
优化程序将在select u.name
from users as u
join accounts as a on u.id = a.user_id
where a.amount > 1000;
和users
之间进行选择,以便首先查看哪个表。然后它会反复到达另一张表。
由于您说accounts
但a.amount > ...
没有提及,优化程序很可能首先选择u
。
如果a
足够有选择性(少于20%的行)和有a.amount > 1000
,那么它将使用该索引。否则,它将对INDEX(amount)
进行表格扫描。
要进入a
,需要一些以u
开头的索引。请注意,id
是一个索引。
my index cookbook中介绍了这个以及更多基础知识。
有关PRIMARY KEY
的讨论,请参阅myxlpain。
请使用EXPLAIN
;它比SHOW CREATE TABLE
更具描述性。
DESCRIBE
也有点神秘,但它确实比常规EXPLAIN FORMAT=JSON SELECT...
有更多细节。
答案 2 :(得分:1)
阱, 由于您的主过滤器有'>'比较运算符,它执行全表扫描因为它可能会也可能不会返回所有行。
当您加入'帐户'表' user_id'列,它显示' user_id'可能键中的索引,但它没有使用它,因为FULL TABLE SCAN过程。