繁体   English   中英

在mysql查询中使用LIMIT是否可以使我的应用程序更快,更高效?

[英]Does using LIMIT in mysql queries will make my application faster and efficient?

假设我在一个表中有超过一百万条记录。 以下哪个代码将更快,更有效地返回结果? 我用过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'];
    }

要么:

$query = mysql_query("select * from reversal where seen = 'false'");
while($q = mysql_fetch_array($query2))
    {
    echo $q['amount'];
    }

您的第一个代码示例计算行数,然后选择所有行(假设没有并发会话修改该表)。

这实际上意味着您还是要选择整个表,因此LIMIT在那儿没有意义(也不会影响性能)。

无论您在哪里阅读,都错误地认为添加LIMIT自动提高查询速度。

Mysql性能优化一个复杂的主题,大多数情况下,没有适用于所有人和每种情况的通用建议。

因此,如果您对mysql的性能有任何实际的问题-请说明您有什么确切的问题,提供实际的数据库模式,有关数据的一些统计信息,等等。

好的,可以在这里回答您的问题,我有一个名为Paymentlog的表,其中有709231条记录。 为了测试目的,我确保它没有任何索引,特别是在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。

在大多数情况下,就像您的示例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的说明来优化SELECTS。 使用GROUP BY时,它变得更加复杂。

是,

从数据库中获取一堆行比获取全部内容更快,更好。

PHP中,我们可以实现分页 ....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM