68

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

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

4

6 回答 6

94

从@chaos给出的答案开始,但有一些修改:

  • 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;
于 2009-02-22T01:52:32.470 回答
20

可能是一个很晚的答案,但这很好也很简单。

select * from table_name order by id desc limit 5

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

于 2014-09-14T13:02:40.273 回答
14

在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
于 2013-09-02T07:27:31.770 回答
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。最后一颗子弹

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 | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
于 2009-02-21T23:16:12.860 回答
3

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

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n
于 2009-02-22T02:36:13.207 回答
0

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

于 2013-10-22T20:14:36.837 回答