Answers:
雷蒙德·尼兰(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数据或索引。