怎样进行范围索引的创建?索引是什么?

TheDisguiser 2020-05-10 22:00:53 java常见问答 7177

索引可以说是大家都非常耳熟能详的东西了,那你知道索引到底是什么吗?又要如何创建范围索引呢?跟着小编一起来了解一下吧。

一、索引是什么?

索引其实就是一个会与表或视图关联的磁盘结构,可以加快SQL语句检索速度,索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B树)中,使 SQL Server 可以快速有效地查找与键值关联的行。

表或着说视图可以包含以下类型的索引:

聚集

聚集索引会根据数据行键值在表中排序与存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。索引定义中包含聚集索引列。

只有当表包含聚集索引时,表数据行才会按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,那它的数据行就会存储在一个称为堆的无序结构中。

非聚集

非聚集索引具有独立于数据行的结构。非聚集索引蕴含着非聚集索引键值,且它的每个键值项都有指向包含该键值的数据行的指针。

非聚集索引中的索引行指向数据行的指针又被称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。

实际上,聚集索引和非聚集索引都能够是唯一的。这意味着任何两行都不能有相同的索引键值。此外,索引也能不是唯一的,即多行可以共享同一键值。

二、如何创建范围索引?

索引和范围提供清晰、简洁的语法来访问序列中的单个元素或元素的子范围。 索引表达式通常返回序列元素的类型。 范围表达式通常返回与源序列相同的序列类型。

若任何类型提供带 Index 或 Range 参数的索引器,则该类型可分别显式支持索引或范围。 采用单个 Range 参数的索引器可能会返回不同的序列类型,如 System.Span

若类型包含名称为 Length 或 Count 的属性,属性有可访问的 Getter 并且其返回类型为 int,则此类型为可计数类型。 不显式支持索引或范围的可计数类型可能为它们提供隐式支持。 有关详细信息,请参阅功能建议说明的隐式索引支持和隐式范围支持部分。 使用隐式范围支持的范围将返回与源序列相同的序列类型。

例如,以下 .NET 类型同时支持索引和范围:String、Span和 ReadOnlySpan。 List支持索引,但不支持范围。

Array 具有更多的微妙行为。 单个维度数组同时支持索引和范围。 多维数组则不支持。 多维数组的索引器具有多个参数,而不是一个参数。 交错数组(也称为数组的数组)同时支持范围和索引器。 下面的示例演示如何循环访问交错数组的矩形子节。 它循环访问位于中心的节,不包括前三行和后三行,以及每个选定行中的前两列和后两列:

var jagged = new int[10][]
{
new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
new int[10] { 10,11,12,13,14,15,16,17,18,19},
new int[10] { 20,21,22,23,24,25,26,27,28,29},
new int[10] { 30,31,32,33,34,35,36,37,38,39},
new int[10] { 40,41,42,43,44,45,46,47,48,49},
new int[10] { 50,51,52,53,54,55,56,57,58,59},
new int[10] { 60,61,62,63,64,65,66,67,68,69},
new int[10] { 70,71,72,73,74,75,76,77,78,79},
new int[10] { 80,81,82,83,84,85,86,87,88,89},
new int[10] { 90,91,92,93,94,95,96,97,98,99},
};
var selectedRows = jagged[3..^3];
foreach (var row in selectedRows)
{
var selectedColumns = row[2..^2];
foreach (var cell in selectedColumns)
{
Console.Write($"{cell}, ");
}
Console.WriteLine();
}

索引和范围的应用场景

要分析较大序列的子范围时,通常会使用范围和索引。 在准确读取所涉及的子范围这一方面,新语法更清晰。 本地函数 MovingAverage 以 Range 为参数。 然后,该方法在计算最小值、最大值和平均值时仅枚举该范围。 在项目中尝试以下代码:

int[] sequence = Sequence(1000);
for(int start = 0; start < sequence.Length; start += 100)
{
Range r = start..(start+10);
var (min, max, average) = MovingAverage(sequence, r);
Console.WriteLine($"From {r.Start} to {r.End}: 	Min: {min},	Max: 
{max},	Average: {average}");
}
for (int start = 0; start < sequence.Length; start += 100)
{
Range r = ^(start + 10)..^start;
var (min, max, average) = MovingAverage(sequence, r);
Console.WriteLine($"From {r.Start} to {r.End}: 	Min: {min},	Max: 
{max},	Average: {average}");
}
(int min, int max, double average) MovingAverage(int[] subSequence, Range 
range) =>
(
subSequence[range].Min(),
subSequence[range].Max(),
subSequence[range].Average()
);
int[] Sequence(int count) =>
Enumerable.Range(0, count).Select(x => (int)(Math.Sqrt(x) * 
100)).ToArray();

以上就是今天的所有内容了,如果想了解更多java常见问答相关内容的话,就请多多关注我们的网站吧。

推荐阅读:

索引的底层原理是什么?它有什么优点和缺点?

Mysql索引数据结构储存原理有哪些?