Php 使用500000条记录的慢速MYSQL查询

Php 使用500000条记录的慢速MYSQL查询,php,mysql,database,performance,Php,Mysql,Database,Performance,我有一个大约500000条记录的mySQL表。该表的大小约为45MB。第一次执行查询时,每次大约需要20秒,但后续查询速度很快。如果我退出并重新登录,查询仍然很快。如果我4-5小时后回来。同样的查询又慢了 查询非常简单 $query = "select * from tableName where uniqueID='$passedID' ORDER BY tableName ASC"; $result = mysql_query($query) or die('Query failed: '

我有一个大约500000条记录的mySQL表。该表的大小约为45MB。第一次执行查询时,每次大约需要20秒,但后续查询速度很快。如果我退出并重新登录,查询仍然很快。如果我4-5小时后回来。同样的查询又慢了

查询非常简单

$query = "select * from tableName where uniqueID='$passedID' ORDER BY tableName ASC";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());

该站点位于具有1 GB内存的VPS上。该网站每天接待大约150名访问者,每人访问10页左右。500000条记录看起来不太大,所以性能应该很好。有人知道是什么原因导致了速度慢吗?

您的问题可能可以通过在uniqueID列上添加索引来解决

根据您的表结构和VPS的性能(或缺乏),最初的响应速度慢可能有几个原因。要确保问题不是MySQL,请确保ID列已正确索引,这样它就不会执行完整表扫描。还要对查询运行解释,以确保它正在使用索引。您的问题可能是缺少索引,迫使MySQL执行完整的表扫描,而不是索引查找

重复查询几乎肯定很快,因为查询缓存正在正确地执行它的工作


VPS也可能存在某种磁盘访问时间问题。如果您看到PHP之外的情况,第一次访问文件夹速度慢,第二次访问正常,请怀疑VPS中存在问题。

任何时候遇到速度慢的查询,请对要调试的查询执行
解释

也就是说,您应该
LIMIT
结果和
INDEX
您的
uniqueID

  • 查看字段名“uniqueID”,我假设这是表中唯一的字段。如果是的话,那你为什么要用“订货人…”?如果字段是唯一的,则最多只返回一条记录,因此无需排序

  • 您的表中是否有一个名为“tableName”的字段,或者它是一个拼写错误

  • 表上有索引吗?跑

    显示tableName的索引

    在这里发布结果,这将允许我们查看索引是否正确构建


  • 此select语句可能存在许多问题

  • 如果在该表上运行多个更新或插入,并且该表是myisam的,那么它将锁定整个表,从而导致select查询变慢
  • 您还需要索引where条件字段,以便它能够在更短的时间内获取结果
  • 对查询进行解释并检查结果在获取结果时查询到底在做什么

  • 要获得更好的索引教程,您可以访问该网站

    您需要在“uniqueID”字段的表中应用索引,索引搜索总是快速的。正如您所说的,500000并不多,查询应该会很快返回结果


    此外,查询在后续调用中运行得更快,因为在执行数据库查询时,记录会缓冲在数据库缓冲区中,如果在记录处于缓冲区时执行相同的查询,那么它显然会更快地返回结果。因此,几个小时后,数据库缓冲区可能已被其他数据覆盖,因此查询必须返回到数据库,以便再次在缓冲区中获取记录。

    您确定查询正确吗,因为您正在从tableName中进行选择并按其进行排序?语句的执行计划是什么?您的意思是“按表名排序"? 这应该是一个列名。尝试对查询进行解释,看看它是如何执行的。您可能还希望在WHERE和ORDER BY子句中的字段上添加索引,但请先查看执行计划,看看是否值得。如果您正在对数据库执行任何写入操作,则这将使查询缓存无效,并且下一个SELECT查询将变慢。此外,如果服务器重新启动,查询缓存将被重置。我的错误是,有一个输入错误。。。完全正确的SQL是:$query=“select*from tPresentationDetails,其中pPresentationID=”$pPresentationID“ORDER BY pPresentationDetailsID ASC”;我尝试运行您在PHPMYADMIN中提到的命令,但它给了我一个错误:#1064-您的SQL语法有一个错误;检查与MySQL服务器版本对应的手册,以了解第行“fortPresentationDetails”附近使用的正确语法1@korkster您再次输入了错误的查询。您的意思是来自于tPresentationDetails的
    ,而不是针对presentationdetails的
    。你所犯的语法错误很能说明问题。您需要进行基本调试。forPresentationDetails看起来像stackoverflow对我的复制/粘贴所做的操作。它消除了周围的引号(第1行的tPresentationDetails)。重试时存在相同的错误#1064-您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,了解第1Ahhhh行的tPresentationDetails的正确语法,这是您的输入错误。您在第一篇文章中指出了“为tableName显示索引”。但是,根据您最近的评论,我只是使用FROM而不是FOR进行了尝试,结果返回了以下内容:pPresentationDetailsID是主键。我最近还在pPresentationID中添加了一个索引,这就是我通过WHERE子句寻找的。目前,我可以在大约0.0002秒的时间内对同一个表执行查询—查询是否有一段时间处于“空闲”状态需要20秒。现在,客户正在使用数据库,在第一次查询之后,她的速度很快。这听起来可能是准确的。我将调查“Explain”,并了解如何为该列编制索引。我会创建唯一列名的索引,还是从中提取信息的列?例如:从car=mazda的数据库中选择car。在一个有500000条记录的表中,可能有50个马自达。若它是另一个表中的唯一键(外键),那个么您就不希望有这个表