8.8.5 估算查询性能

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

在 MySQL 中,索引块通常为 1,024 字节,数据指针通常为四个字节。对于键值长度为三个字节(大小为MEDIUMINT)的 500,000 行 table,该公式 table 示log(500,000)/log(1024/3*2/(3+4)) + 1 = 4搜索。

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

但是,对于写操作,您需要四个搜索请求来查找在何处放置新索引值,通常需要两个搜索来更新索引并写入行。

前面的讨论并不意味着您的应用程序性能会因 log * N *缓慢退化。只要所有内容都由 OS 或 MySQL 服务器缓存,随着 table 的增加,事情只会变得稍微慢一些。在数据变得太大而无法缓存之后,事情开始变得缓慢得多,直到您的应用程序仅受磁盘搜索约束为止(磁盘日志增加了 log * N *)。为避免这种情况,请随着数据的增长而增加密钥缓存的大小。对于MyISAMtable,键缓存大小由key_buffer_size系统变量控制。参见第 5.1.1 节“配置服务器”