我有一个带有索引(自动递增)和整数值的表。该表长数百万行。
如何搜索某个数字是否最有效地出现在表格的最后n行中?
Answers:
从@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;
$certain_number
$n
val
$n
可能是一个很晚的答案,但这很简单。
select * from table_name order by id desc limit 5
该查询将返回您在表中插入的一组后5个值(后5行)
与分页一样,充分利用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 |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
因为它是自动递增的,所以这是我的看法:
Select * from tbl
where certainconditionshere
and autoincfield >= (select max(autoincfield) from tbl) - $n
我知道这可能有点老,但是请尝试使用PDO::lastInsertId
。我认为它可以实现您想要的功能,但是您必须重写您的应用程序才能使用PDO(这样可以更安全地抵御攻击)