假设我在表中有超过100万条记录。以下哪些代码会更快更有效地返回结果?我用过php。
我应该使用它吗?
$query = mysql_query("select count(*) as count from reversals where seen = 'false'");
while($q = mysql_fetch_array($query))
{
$limit = $q['count'];
}
$query2 = mysql_query("select * from reversals where seen = 'false' limit $limit");
while($q = mysql_fetch_array($query))
{
echo $q['amount'];
}
OR:
$query = mysql_query("select * from reversal where seen = 'false'");
while($q = mysql_fetch_array($query2))
{
echo $q['amount'];
}
答案 0 :(得分:2)
您的第一个代码示例计算行数,然后选择所有行(假设没有可以修改此表的并发会话)。
这实际上意味着你无论如何选择整个表格,因此LIMIT
在那里没有意义(并且也不会影响性能)。
无论你在哪里阅读它都是错误的假设,即自动添加LIMIT
会使你的查询更快。
Mysql性能优化 IS 是一个复杂的主题,并且通常没有很多通用的建议适用于每个人以及每种情况。
因此,如果您有任何关于mysql性能的真正的问题 - 请解释您遇到的确切问题,提供真实的数据库架构,一些有关数据的统计信息等等。
答案 1 :(得分:2)
好的在这里回答你的问题是,我有一张名为paymentlog的表,它有709231条记录。出于测试目的,我确保它没有任何索引,特别是在where where条件下使用的列。
我使用了EXPLAIN,我得到了一些东西
explain select * from paymentlog where transdate = '2012-12-01' limit 10 ;
+----+-------------+------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | paymentlog | ALL | NULL | NULL | NULL | NULL | 709231 | Using where |
+----+-------------+------------+------+---------------+------+---------+------+--------+-------------+
即使我添加了LIMIT,您也可以看到它扫描表格中的所有行。因此,LIMIT不会使您的查询更快,只会减少数据量。
现在如果我在上表中为transdate添加一个索引并运行相同的解释,我得到
+----+-------------+------------+------+--------------------+--------------------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+--------------------+--------------------+---------+-------+------+-------+
| 1 | SIMPLE | paymentlog | ref | plog_transdate_idx | plog_transdate_idx | 3 | const | 1069 | |
+----+-------------+------------+------+--------------------+--------------------+---------+-------+------+-------+
所以现在报告的扫描行数是1069,即使它不太可能会扫描1069行,但是当找到限制值时它会停止但是如果我们得到限制值为1000,70的那么它将需要扫描到1069,所以它减少了表格中的扫描行,因为列中的索引在哪里条件,优于709231.
所以结论是通过使用索引可以减少被扫描的行数,但是如果限制相同的行数将使用最多索引1069并且没有索引709231进行扫描。
答案 2 :(得分:1)
在大多数情况下,例如 YES ,因为当达到限制时,mysql将停止扫描结果。
但是如果生成的结果是基于某些东西,比如ORDER BY,LIMIT有帮助,但它可能没有预期的速度。
SELECT * FROM table WHERE indexed_field = 2 LIMIT 10; //fast
SELECT * FROM table WHERE indexed_field = 2 ORDER BY noindexfield LIMIT 10; //less faster, uses filesort.
使用mysql的explain来优化SELECTS。 使用GROUP BY时会变得更复杂。
答案 3 :(得分:0)
是,
从db中获取一堆行比获取整个内容更快更好....
在 PHP 中我们可以实施分页 ....