我正在玩弄(感兴趣),用简单邻接列表中的节点树检索使用局部变量的递归查询。使用不使用INDEX的查询变量进行SELECT选择
我迄今为止的解决方案很有趣,但我想知道为什么MySQL拒绝使用任何INDEX
来优化此查询。 MySQL不能通过使用INDEX
来查找最近的孩子吗?
我很好奇MySQL为什么没有。即使当我使用FORCE INDEX
执行计划不会改变。
这是查询至今,凭借5
是父节点的ID:
SELECT
@last_id := id AS id,
parent_id,
name,
@depth := IF(parent_id = 5, 1, @depth + 1) AS depth
FROM
tree FORCE INDEX (index_parent_id, PRIMARY, index_both),
(SELECT @last_id := 5, @depth := -1) vars
WHERE id = 5 OR parent_id = @last_id OR parent_id = 5
注意,之所以不能是小数据集,因为当我指定FORCE INDEX (id)
或FORCE INDEX (parent_id)
或FORCE INDEX (id, parent_id)
时,行为不会改变...
该文档说:
您也可以使用FORCE INDEX,其行为像USE INDEX(index_list),但除了假定表扫描非常昂贵。换句话说,只有在无法使用某个给定索引来查找表中的行时才使用表扫描。
必须有一些呈现查询无法使用INDEX,但我不明白它是什么。
免责声明:我知道有不同的方式来存储和检索SQL分层数据。我知道嵌套集模型。我没有寻找替代实施。我不是在寻找嵌套集合。
我也知道查询本身是坚果,并产生错误的结果。
我只是想,为什么MySQL是不是在这种情况下使用INDEX
理解(详细)。
有时一个表有这么几条记录,使用索引的开销比读取整个表的时间要多。 – Randy 2012-07-09 21:56:21
@randy现在有一个似是而非的论点... – xandercoded 2012-07-09 21:57:04
@Randy看到更新的问题 – Kaii 2012-07-09 22:03:14