mysql从n个最后一行中选择

时间:2009-02-21 19:59:38

标签: mysql select query-optimization

我有一个索引(自动增量)和整数值的表。该表长达数百万行。

如何最有效地搜索表格的最后n行中是否出现某个数字?

6 个答案:

答案 0 :(得分:91)

从@chaos给出的answer开始,但进行了一些修改:

  • 如果您使用ORDER BY,则应始终使用LIMIT。 RDBMS表没有保证隐式顺序。您可能通常按主键的顺序获取行,但您不能依赖它,也不能移植。

  • 如果您按降序排序,则无需预先知道表格中的行数。

  • 您必须为派生表提供相关名称(也称为表别名)。

这是我的查询版本:

SELECT `id`
FROM (
    SELECT `id`, `val`
    FROM `big_table`
    ORDER BY `id` DESC
    LIMIT $n
) AS t
WHERE t.`val` = $certain_number;

答案 1 :(得分:18)

可能是一个非常晚的答案,但这很好而且简单。

select * from table_name order by id desc limit 5

此查询将返回您在表格中插入的最后5个值(最后5行)的集合

答案 2 :(得分:13)

在mysql中检索最后5行

此查询完美运行

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc

答案 3 :(得分:12)

像分页一样利用SORT和LIMIT。如果你想要第i个行块,请使用OFFSET。

SELECT val FROM big_table
where val = someval
ORDER BY id DESC
LIMIT n;

回应Nir: 排序操作不一定会受到惩罚,这取决于查询计划程序的功能。由于此用例对分页性能至关重要,因此有一些优化(参见上面的链接)。在postgres中也是如此“ORDER BY ... LIMIT可以在没有排序的情况下完成”E.7.1. Last bullet

explain extended select id from items where val = 48 order by id desc limit 10;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | items | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+

答案 4 :(得分:3)

因为它是自动增量,这是我的看法:

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n

答案 5 :(得分:0)

我知道这可能有点旧,但请尝试使用PDO::lastInsertId。我认为它符合您的要求,但您必须重写您的应用程序以使用PDO(这对攻击更安全)