缓慢的MYSQL查询,包含500,000条记录

时间:2011-12-29 03:14:48

标签: php mysql database performance

我有一个大约500,000条记录的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页左右。 500,000条记录似乎不会太大,因此性能应该没问题。有没有人有什么想法可能导致缓慢?

6 个答案:

答案 0 :(得分:1)

初始响应缓慢可能有几个原因,具体取决于您的表结构和VPS的性能(或缺乏性能)。确保问题不是MySQL确保ID列已正确编入索引,因此它不会进行全表扫描。还要对查询运行解释,以确保它使用索引。可能你的问题是缺少索引,迫使MySQL进行全表扫描而不是索引查找。

重复查询几乎肯定是快速的,因为查询缓存正在正常工作。

VPS也可能存在某种磁盘访问时间问题。如果你看到PHP以外的条件,第一次访问文件夹的速度很慢,第二次访问是正常的,那么怀疑VPS中存在问题。

答案 1 :(得分:1)

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

  1. 如果表上正在运行多个更新或插入,并且该表是myisam,那么它将锁定整个表,导致选择速度慢的查询。
  2. 此外,您还需要索引where条件字段,以便它可以在较短的时间内获取结果。
  3. 解析查询并在获取结果时检查查询正在执行的操作。
  4. 要获得更好的索引编制教程,您可以访问this网站。

答案 2 :(得分:0)

可以通过在uniqueID列

上添加索引来解决您的问题

答案 3 :(得分:0)

每次遇到慢查询时,都要对查询进行EXPLAIN调试。

也就是说,您应LIMIT结果,INDEXuniqueID

答案 4 :(得分:0)

  1. 查看字段名称“uniqueID”,我假设这是表中的唯一字段。如果是,那你为什么要使用“order by ....”?如果该字段是唯一的,那么最多只返回一条记录,因此无需订购。

  2. 您的表格中是否有一个名为“tableName”的字段,还是一个拼写错误?

  3. 桌子上有索引吗?运行

    显示tableName的索引;

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

答案 5 :(得分:0)

您需要在字段'uniqueID'的表格中应用索引。索引搜索始终很快。正如你所说500000并不多,查询应该很快返回结果。

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