鉴于索引是非常重要的,因为你的数据集的规模增加了,有人可以解释索引如何在数据库无关的层面上工作吗? 有关索引字段的查询的信息,请查看如何索引数据库列。 答案 为什么需要? 当数据存储在基于磁盘的存储设备上时,它将作为数据块存储。这些块被完整访问,使它们成为原子磁盘访问操作。磁盘块的结构与链接列表非常相似,都包含数据部分,指向下一个节点(或块)位置的指针,并且都不需要连续存储。 由于许多记录只能在一个字段上排序,所以我们可以声明,在未排序的字段上搜索需要线性搜索,它需要N/2块访问(平均),N块的数量在哪里桌子横跨。如果该字段是非关键字段(即不包含唯一条目),则必须在N块访问时搜索整个表空间。 而对于排序的字段,可以使用二进制搜索,其具有log2 N块访问。此外,由于数据是在给定非关键字段的情况下进行排序的,因此一旦找到更高的值,表格的其余部分就不需要搜索重复值。因此,性能增加是相当大的。 什么是索引? 索引是一种对多个字段上的多个记录进行排序的方法。在表中的字段上创建索引会创建另一个数据结构,该结构保存字段值以及指向与其相关的记录的指针。然后对索引结构进行排序,从而对其执行二进制搜索。 索引的缺点是这些索引在磁盘上需要额外的空间,因为索引使用MyISAM引擎一起存储在一个表中,如果同一个表中的许多字段是相同的,那么该文件可以快速达到底层文件系统的大小限制索引。 它是如何工作的? 首先,让我们概述一个示例数据库表模式; 字段名称数据类型磁盘上的大小 id(主键)无符号整数4字节 firstName Char(50)50个字节 姓氏字符(50)50个字节 emailAddress字符(100)100个字节 注意:字符被用来代替varchar以允许磁盘值的准确大小。此样本数据库包含500万行,并且未进行索引。现在将分析几个查询的性能。这些是使用id(排序的关键字段)的查询和使用firstName(非关键字未排序的字段)的查询。 示例1 –分类与未排序的字段 鉴于我们的示例数据库中r = 5,000,000记录的固定大小给出了记录的R = 204字节长度,并且它们使用MyISAM引擎存储在表中,该引擎使用默认块大小B = 1,024字节。该表的阻止因子将是bfr = (B/R) = 1024/204 = 5每个磁盘块的记录。保持表格所需的块的总数是N = (r/bfr) = 5000000/5 = 1,000,000块。 如果N/2 = 500,000id字段是关键字段,那么对id字段进行线性搜索需要平均访问块来查找值。但是由于id字段也被排序,所以可以进行二分搜索,要求平均log2 1000000 = 19.93 = 20访问块。瞬间我们可以看到这是一个巨大的改进。 现在,firstName字段既没有排序也没有关键字段,因此二进制搜索是不可能的,并且这些值也不是唯一的,并且因此该表格将需要搜索到末尾以进行精确的N = 1,000,000块访问。索引编制旨在纠正这种情况。 鉴于索引记录仅包含索引字段和指向原始记录的指针,因此它会比它指向的多字段记录更小。所以索引本身需要的磁盘块比原始表要少,因此需要更少的块访问来遍历。firstName字段上的索引模式概述如下; 字段名称数据类型磁盘上的大小 firstName Char(50)50个字节