Skip to main content

5.估计查询性能

在大多数情况下,可以通过计算磁盘查找次数来估计查询性能。 对于小型表,通常可以在一次磁盘查找中找到一行(因为索引可能已缓存)。 对于较大的表,可以估计,使用 B 树索引,需要多次查找才能找到一行:log(row_count) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1。

在 MySQL 中,索引块通常为 1,024 字节,数据指针通常为 4 字节。 对于50万行表,键值长度为3个字节(MEDIUMINT大小),公式表示log(500,000)/log(1024/3*2/(3+4)) + 1 = 4次查找。

该索引需要大约 500,000 * 7 * 3/2 = 5.2MB 的存储空间(假设典型的索引缓冲区填充率为 2/3),因此内存中可能有大部分索引,因此只需要一两次调用 读取数据以查找行。

但是,对于写入,需要四个查找请求来查找放置新索引值的位置,并且通常需要两次查找来更新索引并写入行。

前面的讨论并不意味着应用程序性能会缓慢下降 log N。只要所有内容都由操作系统或 MySQL 服务器缓存,随着表变大,事情只会稍微变慢。 当数据变得太大而无法缓存后,速度开始变慢,直到应用程序仅受磁盘查找(增加 log N)的限制。 为了避免这种情况,请随着数据的增长而增加键缓存大小。 对于MyISAM表,键缓存大小由key_buffer_size系统变量控制。