MySQL смещает бесконечные строки - PullRequest
100 голосов
/ 01 ноября 2008

Я хотел бы создать запрос, который отображает все результаты в таблице, но смещен на 5 от начала таблицы. Насколько я могу судить, MySQL LIMIT требует как ограничения, так и смещения. Есть ли способ сделать это?

Ответы [ 8 ]

138 голосов
/ 07 ноября 2008

Из руководства MySQL по LIMIT :

Чтобы получить все строки из определенного смещение до конца результата установить, вы можете использовать большое количество для второй параметр. Это утверждение извлекает все строки из 96-го ряда до последнего:

SELECT * FROM tbl LIMIT 95, 18446744073709551615;
22 голосов
/ 07 ноября 2008

Как вы упомянули, требуется LIMIT, поэтому вам нужно использовать максимально возможный лимит, который равен 18446744073709551615 (максимум без знака BIGINT)

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5
6 голосов
/ 27 июля 2016

Как отмечалось в других ответах, MySQL предлагает использовать 18446744073709551615 в качестве количества записей в пределе, но примите во внимание следующее: Что бы вы сделали, если бы вернули 18,446,744,073,709,551,615 записей? На самом деле, что бы вы сделали, если бы получили 1 000 000 000 записей?

Может быть, вы хотите более одного миллиарда записей, но я хочу сказать, что есть ограничение на число, которое вы хотите , и оно меньше 18 квинтиллионов. Ради стабильности, оптимизации и, возможно, удобства использования я бы предложил наложить некоторый значимый предел на запрос. Это также уменьшит путаницу для тех, кто никогда не видел этого волшебного числа, и имеет дополнительное преимущество, сообщая, по крайней мере, сколько записей вы готовы обработать одновременно.

Если вам действительно нужно получить все 18 квинтиллионных записей из вашей базы данных, возможно, вам действительно нужно получить их с шагом 100 миллионов и выполнить цикл 184 миллиарда раз.

5 голосов
/ 07 ноября 2008

Другой подход - выбрать автоимкрементированный столбец и затем отфильтровать его с помощью HAVING.

SET @a := 0; 
select @a:=@a + 1 AS counter, table.* FROM table 
HAVING counter > 4

Но я бы, вероятно, придерживался подхода с верхним пределом.

0 голосов
/ 10 июня 2016

Вы можете использовать оператор MySQL с LIMIT:

START TRANSACTION;
SET @my_offset = 5;
SET @rows = (SELECT COUNT(*) FROM my_table);
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
EXECUTE statement USING @rows, @my_offset;
COMMIT;

Протестировано в MySQL 5.5.44. Таким образом, мы можем избежать вставки номера 18446744073709551615.

примечание: транзакция удостоверяется, что переменная @rows соответствует таблице, рассматриваемой при выполнении оператора.

0 голосов
/ 11 февраля 2014
WHERE .... AND id > <YOUROFFSET>

id может быть любым автоинкрементным или уникальным числовым столбцом, который у вас есть ...

0 голосов
/ 29 января 2014

Я знаю, что это старо, но я не видел подобного ответа, поэтому я бы использовал это решение.

Сначала я выполнил бы запрос подсчета к таблице, чтобы увидеть, сколько существует записей. Этот запрос быстрый и обычно время выполнения незначительно. Что-то вроде:

SELECT COUNT(*) FROM table_name;

Затем я построил бы свой запрос, используя результат, полученный из count в качестве моего предела (так как это максимальное количество строк, которое может вернуть таблица). Что-то вроде:

SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;

Или, возможно, что-то вроде:

SELECT * FROM table_name LIMIT desired_offset, count_result;

Конечно, если необходимо, вы можете вычесть требуемый_смещение из счетчика_результатов, чтобы получить фактическое, точное значение для предоставления в качестве предела. Передача значения «18446744073709551610» просто не имеет смысла, если я действительно могу определить подходящий предел для предоставления.

0 голосов
/ 11 апреля 2012

Только сегодня я читал о лучшем способе получения огромных объемов данных (более миллиона строк) из таблицы mysql. Один из способов, как предлагается, заключается в использовании LIMIT x,y, где x - это смещение, а y - последняя строка, которую вы хотите вернуть. Однако, как я выяснил, это не самый эффективный способ сделать это. Если у вас есть столбец автоинкремента, вы также можете легко использовать оператор SELECT с предложением WHERE, в котором указано, с какой записи вы хотите начать.

Например, SELECT * FROM table_name WHERE id > x;

Кажется, что mysql получает все результаты, когда вы используете LIMIT, а затем показывает только те записи, которые соответствуют смещению: не самое лучшее для производительности.

Источник: Ответ на этот вопрос Форумы MySQL . Просто примите к сведению, что вопрос о 6 лет.

...