我有一个大约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条记录似乎不会太大,因此性能应该没问题。有没有人有什么想法可能导致缓慢?
答案 0 :(得分:1)
初始响应缓慢可能有几个原因,具体取决于您的表结构和VPS的性能(或缺乏性能)。确保问题不是MySQL确保ID列已正确编入索引,因此它不会进行全表扫描。还要对查询运行解释,以确保它使用索引。可能你的问题是缺少索引,迫使MySQL进行全表扫描而不是索引查找。
重复查询几乎肯定是快速的,因为查询缓存正在正常工作。
VPS也可能存在某种磁盘访问时间问题。如果你看到PHP以外的条件,第一次访问文件夹的速度很慢,第二次访问是正常的,那么怀疑VPS中存在问题。
答案 1 :(得分:1)
此select语句可能存在许多问题。
要获得更好的索引编制教程,您可以访问this网站。
答案 2 :(得分:0)
可以通过在uniqueID列
上添加索引来解决您的问题答案 3 :(得分:0)
每次遇到慢查询时,都要对查询进行EXPLAIN
调试。
也就是说,您应LIMIT
结果,INDEX
列uniqueID
。
答案 4 :(得分:0)
查看字段名称“uniqueID”,我假设这是表中的唯一字段。如果是,那你为什么要使用“order by ....”?如果该字段是唯一的,那么最多只返回一条记录,因此无需订购。
您的表格中是否有一个名为“tableName”的字段,还是一个拼写错误?
桌子上有索引吗?运行
显示tableName的索引;
并在此处发布结果,这将允许我们查看索引是否构建正确。
答案 5 :(得分:0)
您需要在字段'uniqueID'的表格中应用索引。索引搜索始终很快。正如你所说500000并不多,查询应该很快返回结果。
此外,查询在后续调用中运行得更快,因为执行数据库查询时,记录会缓存在数据库缓冲区中,如果在记录处于缓冲区时执行相同的查询,则显然会更快地返回结果。因此,几个小时后,数据库缓冲区可能已被其他一些数据覆盖,因此查询必须一直返回数据库以便在缓冲区中再次获取记录。