mysql磁盘整理 mysql磁盘块_搜索

HappyDay1234567890

为什么需要它?当数据存储在基于磁盘的存储设备上时,它被存储为数据块.这些块全部被访问,使它们成为原子磁盘访问操作。磁盘块的结构与链接列表的方式基本相同;它们都包含一个数据节,一个指向下一个节点(或块)位置的指针,并且都不需要连续存储。由于许多记录只能在一个字段上排序,我们可以声明,在未排序的字段上搜索需要线性搜索N/2块访问(平均),其中N表跨越的块数。如果该字段是一个非键字段(即不包含唯一项),则必须在N封锁通道。而对于排序字段,可以使用二进制搜索,它具有log2 N封锁通道。另外,由于数据是根据非键字段进行排序的,因此一旦找到更高的值,就不需要搜索表的其余部分的重复值。因此,业绩的增长是大幅度的。什么是索引?索引是对多个字段中的许多记录进行排序的一种方法。在表中的字段上创建索引将创建另一个保存字段值的数据结构,并创建指向与其相关的记录的指针。然后对此索引结构进行排序,允许在其上执行二进制搜索。索引的缺点是,这些索引需要磁盘上的额外空间,因为索引一起存储在使用MyISAM引擎的表中,如果对同一表中的许多字段进行索引,则该文件可以迅速达到基础文件系统的大小限制。它怎麽工作?首先,给出一个样本数据库表模式;Field name       Data type      Size on disk

id (Primary key) Unsigned INT   4 bytes

firstName        Char(50)       50 bytes

lastName         Char(50)       50 bytes

emailAddress     Char(100)      100 bytes注使用CHAR代替varchar,使磁盘值具有精确的大小。此示例数据库包含500万行,且未编入索引。现在将分析几个查询的性能。这些是使用ID(一个排序的密钥字段)和一个使用首名(无键未排序字段)。例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街区。在id字段上进行线性搜索需要平均N/2 = 500,000块访问以查找值,因为id字段是一个关键字段。但是,由于id字段也是排序的,所以可以进行二进制搜索,平均需要log2 1000000 = 19.93 = 20封锁通道。我们马上就能看到这是一个巨大的进步。现在首名字段既不是排序的,也不是键字段的,所以二进制搜索是不可能的,值也不是唯一的,因此表将需要搜索到最后才能找到确切的值。N = 1,000,000封锁通道。正是这种情况,索引的目的是纠正。假设索引记录只包含索引字段和指向原始记录的指针,那么它将比它所指向的多字段记录更小,这是合理的。因此,索引本身需要的磁盘块比原始表少,因此需要更少的块访问来迭代。上的索引的架构。首名字段概述如下:Field name       Data type      Size on disk

firstName        Char(50)       50 bytes

(record pointer) Special        4 bytes注:MySQL中的指针长度为2、3、4或5个字节,这取决于表的大小。例2 - 索引给出我们的样本数据库r = 5,000,000记录的索引记录长度为R = 54字节,并使用默认块大小。B = 1,024字节。索引的阻塞因子为bfr = (B/R) = 1024/54 = 18每个磁盘块的记录。保存索引所需的块总数为N = (r/bfr) = 5000000/18 = 277,778街区。现在使用首名字段可以利用索引来提高性能。这允许对索引进行二进制搜索,平均搜索值为log2 277778 = 18.08 = 19封锁通道。若要查找实际记录的地址,需要进一步的块访问才能读取,使总数达到19 + 1 = 20块访问,与查找首名在非索引表中匹配。什么时候使用?考虑到创建索引需要额外的磁盘空间(从上面的示例增加277,778块,增加了28%),而且过多的索引可能会导致文件系统大小限制带来的问题,因此必须仔细考虑选择要索引的正确字段。由于索引只用于加速搜索记录中的匹配字段,因此,只用于输出的索引字段在执行插入或删除操作时只会浪费磁盘空间和处理时间,这是合理的,因此应该避免。此外,考虑到二进制搜索的性质,数据的基数或唯一性也很重要。在基数为2的字段上索引会将数据分割成两半,而基数为1,000将返回大约1,000条记录。在基数如此低的情况下,效率降低到线性排序,如果基数小于记录数的30%,查询优化器将避免使用索引,从而有效地浪费了索引的空间。