如何估算MySQL查询执行的I / O操作?


13

在亚马逊的RDS上,每100万个I / O请求支付约0.10美元。我注意到流量非常低的数据库有大量(数十万个)I / O请求。看到这一点,我做了进一步的研究,发现这个问题描述了对于一个拥有6,000个用户的网站,他每月产生8亿个I / O请求,这将使他每月花费约80美元。

因此,我想提前知道MySQL查询将生成多少个I / O操作,以及如何优化/最小化它们。是否有任何方法可以估算查询将执行的I / O操作数,以及我可以遵循的任何一般规则来使其尽可能降低?

Answers:


2

雷蒙德·尼兰Raymond Nijland)对问题的评论产生了社区维基答案

使用EXPLAIN。这样,您可以查看查询是否需要磁盘IO。您需要在栏中避免使用额外的 “使用临时”或“使用临时;使用文件排序(请注意文件排序是一个误导性的名称:如果结果集适合内存,则快速排序将在内存中运行)”。

这很可能是由子查询/联合/排序依据/分组依据/引起的。。。根据具有快速排序算法的IO读取和IO写入进行设置。

MySQL的内部临时表使用中,您可以在MySQL需要创建基于磁盘的MyISAM表时进行读取。也许您可以使用avg_row_length *行(尽管请注意,innoDB引擎中explain 的值并不准确)来检查结果是否适合堆。请参阅显示表状态语法

通常,InnoDB或MyISAM可以更好地避免I / O请求吗?

InnoDB将缓冲表数据和索引数据,而MyISAM仅缓冲索引键。当说明列的额外内容未显示“使用索引” 时,需要对表数据进行I / O。

如果两者都使用索引:对于InnoDB,如果缓冲区很热,则可以从内存中加载数据。如果索引需要来自磁盘,则可以使用公式来计算选择,插入和更新所需的IO读取。从估计查询性能

对于小型表,通常可以在一个磁盘搜索中找到一行(因为索引可能已缓存)。对于较大的表,您可以估计,使用B树索引,您需要进行许多查找才能找到行:

log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1

InnoDB索引更大,因为它将数据从PRIMARY / UNIQUE键存储到KEY索引中。这样速度更快并且需要更少的IO搜索,但是您可以压缩InnoDB数据或索引。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.