SQL查询上聚簇索引的性能

时间:2015-12-12 06:12:45

标签: mysql sql indexing time-complexity clustered-index

假设您有两个表:

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

你认为我的假设是正确的吗?谁能帮助我?

嵌套循环连接算法在这里:

enter image description here

1 个答案:

答案 0 :(得分:1)

join course 
on student.id = Course.id

O(MN)(Worst-Case)中正确,其中MN分别是第一个和第二个表中的行数,因为它是{{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之间的密钥数sd - 1 < s < 2d被称为树的顺序,程度或分支因子。

希望它有所帮助!