我们限制某一个查询的返回不超过 100 行数据:
# bad example
data = list(Sale.objects.all())[:100]
这很糟糕,因为虽然只返回 100 行数据,但是其实你已经把所有的行都取出来放进了内存...从第一层的树叶为第二层创建一棵新树,以此类推。
索引中列的顺序非常重要。
在上面的例子中,我们首先会得到一个组(group)的树,另一个树是所有它的用户(user)。...查找单个值的成本是随机访问表的树的高度 + 1。这使得 B-Tree 索引非常适合独特的约束和(一些)范围查询。
B-Tree索引的缺点是它的大小 -- B-Tree 索引可能会变大。...假设我们在一列中有这些值,每一个都是一个块:
1, 2, 3, 4, 5, 6, 7, 8, 9
我们为每三个相邻的块创建一个范围:
[1,2,3], [4,5,6], [7,8,9]
对于每个范围,我们将保存范围内的最小值和最大值...再举一个例子,这次列中的值不会被很好地排序:
[2–9], [1–7], [3–8]
再试着查找 5:
[2–9] — 可能在这里
[1–7] — 可能在这里
[3–8] — 可能在这里
索引是无用的