您问“ 为什么要花太长时间?”。您还说:“ 不幸的是,这花费了5秒钟以上的时间来检索数据并将其显示给我 ”。另外,您报告了查询的概要分析输出。
如您所见,分析器为每个步骤报告的时间总和为0.000154秒。因此,从分析器的角度来看,查询是在这样的时间(0.000154)中完成的。
那么,为什么要在“ ...超过5秒内 ” 获得结果?
您说过要过滤一个3字符字段的2千3百万条记录表。不幸的是,您没有告诉我们您的查询正在返回多少条记录...,但是由于提供了EXPLAIN SELECT,看来您的查询返回了336052条记录。
同样,您的所有活动似乎都通过某个GUI(PHPMyAdmin?)运行。
因此,在完成上述所有操作之后,我们可以将您的原始问题重新表述为:
“如果相关查询的MySQL执行时间为0.000154秒,为什么我会在5秒钟以上的GUI内得到336.052条记录?”
在我看来,答案很简单:5秒钟是让336.052条记录沿着路径运行的时间(确实很短):MySQL引擎=> MySQL客户端库=> PHP MySQL模块=> Apache =>网络= >您的PC TCP / IP堆栈=>浏览器=> DOM解析器/生成器/等。=>呈现的HTML页面。
根据我以前的经验,结果传输所需的时间“通常”比检索此类数据所需的时间高得多。当涉及到类似PHP-MySQL或Perl-DBD-MySQL之类的库时,尤其如此:在 MySQL正确识别(并提取)所有记录后,它们确实需要大量时间来检索记录。
如何解决这个问题呢?
再一次,很容易:您真的确定需要在单个完整数据集中的所有 336.052记录吗?
如果您的回答确实是“是!我需要所有这些”,那么您的应用程序将自行处理分页和/或用户交互,并且...一旦收集了所有此类数据,则可能会花费大量时间与用户交互,而无需任何进一步的MySQL交互。在这种情况下,等待5秒(或更长时间)应该不是问题。
如果您的回答是“否,我想处理一个更大的“人类”数据集”,那么(至少)您将不得不优化查询,以便它可以为您提供一个更多的“人类”数据集(数十或最多数百条记录)。在这种情况下,我敢打赌,您会在更短的时间内得到结果。
顺便说一句:这与您在ServerFault上的另一篇文章中遇到的问题完全相同:88秒,让132M条记录沿着....-非MySQL严格相关的魔术路径:-)