假设您有两个表:
Student(id, class) // 100 rows
Course(id, course) // 100 rows
最初假设两个表都没有索引。现在假设我们有一个查询: -
select id, course
from Student join course
on student.id = Course.id and student.id = 20
由于您没有任何索引,因此您需要遍历两个表中的所有行。
Time complexity - O(100 x 100)
现在我们更新了表格,Student.id
是主键。将在其上创建聚簇索引,现在整体复杂性为
Time complexity - O(log 100) // Nested loop join
你认为我的假设是正确的吗?谁能帮助我?
嵌套循环连接算法在这里:
答案 0 :(得分:1)
join course
on student.id = Course.id
在O(MN)
(Worst-Case)中正确,其中M
和N
分别是第一个和第二个表中的行数,因为它是{{1} }(加入equi-join
条件)它比较第一行和第二行的每一行。
但是,你还有第二个条件。由于=
具有许多性能增强算法,因此很有可能首先评估SQL
。然后你首先要student.id = 20
(假设学生表的行数是线性的)来搜索M
。然后,如果student.id = 20
只是常数,让我们说m,你会student.id = 20
。
总而言之,m * N
。
现在这取决于O(M + (m * N))
。如果m
是常数,那么在渐近分析中m
,因为O(M + N) = O(2M)
并且最终得到M=N
或线性。否则,如果O(M) = O(N)
位于m
,那么它将是Omega(1)
或您假设为O(M + M * N)
。
然后关于O(MN)
将会/可以创建聚簇索引。现在用于将来查询的时间复杂度将如您所说PRIMARY KEY
,其中K是新表中的行(可以是!= 100)。
现在为什么O(log K)
?因为关系数据库将索引结构为B-trees。然后在WC中,你会在树的高度得到log K
。
更准确地说
因为在B树上你有最大值。 O(log K)
和2d children
之间的密钥数s
。 d - 1 < s < 2d
被称为树的顺序,程度或分支因子。
希望它有所帮助!