我一直在阅读有关 mariadb 中的表分区的内容。
我知道它不会带来任何直接的性能提升。但是索引表呢?他们也分区了吗?
假设一张表被分区,因此user_id
与一个用户相关的所有数据都将位于同一个表分区中。因此,在用户会话中,每个查询只会从单个表分区获取数据
我的问题是:索引表也会相应分区吗?当执行查询时,它仅在partitionend索引表中搜索,而不是要搜索的整个= less索引
我一直在阅读有关 mariadb 中的表分区的内容。
我知道它不会带来任何直接的性能提升。但是索引表呢?他们也分区了吗?
假设一张表被分区,因此user_id
与一个用户相关的所有数据都将位于同一个表分区中。因此,在用户会话中,每个查询只会从单个表分区获取数据
我的问题是:索引表也会相应分区吗?当执行查询时,它仅在partitionend索引表中搜索,而不是要搜索的整个= less索引
这样想...分区表是一组基于分区键的单独表。每个“子表”都有 BTree 中的分区数据,以及每个二级索引的单独 BTree。子表(分区)相互独立。(通常,权衡是清洗。)
情况 1:如果“分区修剪”决定仅应用一个分区,则只会查找一个子表。在这种情况下,在选择分区与可能需要在单个索引中进行更多工作之间需要进行权衡如果表没有分区。
情况 2:如果不应用修剪,则在每个子表中搜索(如果适用,通过其索引之一)所需的行。然后,将每个子表的结果合并起来(a la
UNION
)。这可能会很慢——因为“打开”每个分区并查看每个分区中的索引。(O(Np) 用于查找所有 Np 分区,然后 O(log Nr) 来钻取每个 Np 索引。更多讨论:分区
是的,与仅线性划分数据的常规分区相比,索引以指数方式“分区”数据。索引的搜索时间复杂度为
O(log(n))
,分区为O(n)
。索引的目的是提高查询的性能,而分区则没有那么多。相反,分区旨在改进数据管理,例如一次仅删除不再需要的数据子集。是的,只要您的索引针对其所使用的查询进行了正确的设计,并且您对其进行索引搜索,那么它只需要有效地搜索与您的查询相关的索引部分。