mysql выбрать из n последних строк - PullRequest
65 голосов
/ 21 февраля 2009

У меня есть таблица с индексом (автоинкремент) и целочисленным значением. Таблица состоит из миллионов строк.

Как я могу найти, если определенное число появляется в последних n строках таблицы наиболее эффективно?

Ответы [ 6 ]

91 голосов
/ 22 февраля 2009

Начиная с ответа , заданного @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;
18 голосов
/ 14 сентября 2014

Может быть очень поздно, но это хорошо и просто.

select * from table_name order by id desc limit 5

Этот запрос вернет набор из 5 последних значений (5 последних строк), которые вы вставили в таблицу

13 голосов
/ 02 сентября 2013

Последние 5 строк извлекаются в MySQL

Этот запрос отлично работает

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
12 голосов
/ 22 февраля 2009

Воспользуйтесь преимуществами сортировки и ограничения, как при разбивке на страницы. Если вам нужен 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 | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
3 голосов
/ 22 февраля 2009

, потому что это автоинкремент, вот мое мнение:

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n
0 голосов
/ 23 октября 2013

Я знаю, что это может быть немного устаревшим, но попробуйте использовать PDO::lastInsertId. Я думаю, что он делает то, что вы хотите, но вам придется переписать ваше приложение, чтобы использовать PDO (что намного безопаснее от атак)

...