看看第一个场景,你有一个有 2 列的表 - 父 (P) 和子 (C)。
个人电脑 1-3 2-8 3-6 6-4 8-7
当用户搜索“1”的所有后代时,它将显示:
个人电脑 1-3 3-6 6-4
& 当用户搜索“2”的所有后代时,它将显示:
个人电脑 2-8 8-7
这是获取数据的 Mysql 查询
select distinct col1
from (select col1,
@pv:=(case when find_in_set(col2, @pv) then @pv else concat(@pv, ',', col2)
end) as 'col2'
from table1 join
(select @pv:='1') tmp
on find_in_set(col1, @pv) > 0
) t
好的,您知道数据库索引是对列进行索引,以便数据库可以比没有索引更快地查找数据库。
但是,在上面提到的第一个场景中,“您认为 DB 索引在父子表中起重要作用吗?”
好的,如果用户搜索“2”的所有后代,那么数据库首先找到“2-8”,那么它必须跳过2条记录才能找到下一个孩子“8-7”。
这是一个简单的例子,但是如果有数千条记录彼此相距很远(或者数据的位置非常碎片化),那么“DB(假设父子列被索引)如何查找数据在第一种情况下很快?”
但是,如果我们让所有后代像在第二个场景中一样坐在一起:
个人电脑 1-3 3-6 6-4 2-8 8-7
那么“DB(即使我们不索引父子列)在第二种情况下查找数据的速度是否比第一种情况快?”
注意:如果你像这样颠倒后代的顺序:
个人电脑 6-4 3-6 1-3 2-8 8-7
& 如果你搜索“1”那么它只会显示“3”,它不会显示“3-6”和“6-4”,因为“3-6”和“6-4”不是连续的命令。这意味着MYSQL在运行上述查询时,将从上到下搜索记录。所以就意味着Mysql不会从头开始搜索下一个后代,-> 你这么认为吗?
注意:请阅读此链接@Symbol - Mysql 中递归 SELECT 查询的解决方案?