解释查询 - 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 扫描过程。
您似乎在询问 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
之间选择 table 首先查看。然后它会反复伸入另一个 table.
既然你说了a.amount > ...
而没有说u
,那么优化器很可能会先选择a
。
如果 a.amount > 1000
具有足够的选择性(少于 20% 的行) 和 则有 INDEX(amount)
,它将使用该索引。否则它将对 a
.
进行 table 扫描
要进入 u
,它需要一些以 id
开头的索引。请记住 PRIMARY KEY
是 一个索引。
中涵盖了这一点以及更多基础知识
有关 EXPLAIN
的讨论,另请参阅 myxlpain。
请使用SHOW CREATE TABLE
;它比 DESCRIBE
.
更具描述性
EXPLAIN FORMAT=JSON SELECT...
也有点神秘,但它确实比常规 EXPLAIN
.
有更多细节
我正在尝试学习 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 扫描过程。
您似乎在询问 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
之间选择 table 首先查看。然后它会反复伸入另一个 table.
既然你说了
a.amount > ...
而没有说u
,那么优化器很可能会先选择a
。如果
a.amount > 1000
具有足够的选择性(少于 20% 的行) 和 则有INDEX(amount)
,它将使用该索引。否则它将对a
. 进行 table 扫描
要进入
u
,它需要一些以id
开头的索引。请记住PRIMARY KEY
是 一个索引。
有关 EXPLAIN
的讨论,另请参阅 myxlpain。
请使用SHOW CREATE TABLE
;它比 DESCRIBE
.
EXPLAIN FORMAT=JSON SELECT...
也有点神秘,但它确实比常规 EXPLAIN
.