У меня есть таблица с индексом (автоинкремент) и целочисленным значением. Таблица составляет миллионы строк.
Как я могу выполнить поиск, если наиболее эффективный номер в последних n строках таблицы отображается?
У меня есть таблица с индексом (автоинкремент) и целочисленным значением. Таблица составляет миллионы строк.
Как я могу выполнить поиск, если наиболее эффективный номер в последних n строках таблицы отображается?
Начиная с ответа , данного @chaos, но с несколькими изменениями:
Вы всегда должны использовать ORDER BY
, если используете LIMIT
. Для таблицы РСУБД не гарантируется скрытый порядок. Обычно вы можете получать строки в порядке первичного ключа, но вы не можете полагаться на это, и он не переносится.
Если вы заказываете в порядке убывания, вам не нужно заранее знать количество строк в таблице.
Вы должны указать имя корреляции (aka alias) для производной таблицы.
Здесь моя версия запроса:
SELECT `id`
FROM (
SELECT `id`, `val`
FROM `big_table`
ORDER BY `id` DESC
LIMIT $n
) AS t
WHERE t.`val` = $certain_number;
Воспользуйтесь преимуществами 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 table_name order by id desc limit 5
Этот запрос вернет набор из последних 5 значений (последние 5 строк), которые вы ввели в таблицу
Последние 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
потому что это автоинкремент, вот мой прием:
Select * from tbl
where certainconditionshere
and autoincfield >= (select max(autoincfield) from tbl) - $n
Я знаю, что это может быть немного старым, но попробуйте использовать PDO::lastInsertId
. Я думаю, что он делает то, что вы хотите, но вам придется переписать свое приложение на использование PDO (что намного безопаснее против атак)