在mysql查询中使用LIMIT会使我的应用程序更快更有效吗?

时间:2014-01-21 09:01:12

标签: php mysql

假设我在表中有超过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'];
    }

4 个答案:

答案 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 中我们可以实施分页 ....