我在谈论InnoDB表的优化时会看到这样的短语,但从未解释过:
还有:
答案 0 :(得分:4)
从磁盘读取一行比从RAM读取同一行的时间长约100,000倍。
参见Numbers Everyone Should Know,基于Jeff Dean在2009年的一次有影响力的主题演讲。从RAM读取大约需要100纳秒。磁盘搜索需要大约10,000,000纳秒(当然一些磁盘速度更快,但最好的磁盘仍然比RAM慢几千倍)。
由于我们通常多次读取数据,因此我们希望避免多次从磁盘读取数据的开销。因此,第一次读取数据会将数据复制到RAM,然后后续读取将利用RAM的更快性能。
但是RAM是易失性的(当计算机断电时RAM中的数据被擦除),并且RAM比每个存储单元的磁盘要贵得多。因此,我们通常使用大磁盘(例如1 TB)来存储大量数据,并使用较少量的RAM(数据库服务器上为typically 16-64 GB)来存储最常访问的数据。
大多数情况下,我们可以为大多数读取假设数据库帐户的相对较小的子集。这称为Pareto Principle。因此,即使您的RAM比磁盘小得多,您也可以假设您可以在90%的时间内读取已经在RAM中的数据。
你可以看到它在MySQL中的效果如何:
mysql> SHOW ENGINE INNODB STATUS\G
...
----------------------
BUFFER POOL AND MEMORY
----------------------
...
Buffer pool hit rate 929 / 1000 ...
...
命中率为929/1000表示在1000行读取中,它能够读取RAM中的行929次。剩下的71次必须从磁盘读取数据行。这不是一个糟糕的比例,但如果你经常访问的数据完全适合RAM,你会看到这个比例增加到999/1000甚至是1000/1000。
您不一定需要与整个数据库一样多的RAM - 您只需要足够大的RAM来满足大多数查询。当然,确保最后一小部分查询从RAM读取数据会更好。如果我们能够承受1000 GB的RAM,那将是一件好事,但通常做出妥协会更具成本效益。
如果您想了解更多信息,请参阅以下资源:
答案 1 :(得分:1)