"Limite 1000,25" vs "limite 25 Deslocamento 1000"

11

Recentemente eu descobri que o MySQL tem um offsetrecurso. Eu tenho tentado encontrar documentação sobre os resultados do deslocamento, ou a diferença entre o deslocamento e a variante limite, mas não consigo encontrar o que estou procurando.

Digamos que tenho 10.000 linhas em uma tabela e quero 25 resultados, a partir da linha 1.000. Tanto quanto cheguei até aqui, eu poderia fazer as duas coisas para obter o mesmo resultado:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

O que eu gostaria de saber é a diferença entre os dois.

  • Isso realmente faz o mesmo ou meu entendimento está errado?
  • É um mais lento / mais rápido em tabelas maiores
  • O resultado do deslocamento muda quando o faço WHERE column=1(digamos, a coluna tem> 100 valores diferentes)
  • O resultado da compensação muda quando eu faço ORDER BY column ASC(desde que tenha valores aleatórios)

Se essa é uma pergunta "estúpida" e alguém conhece alguma documentação que ilumine o assunto, adicione-a nas respostas.
Tenho a sensação de que o deslocamento ignora as primeiras X linhas encontradas no banco de dados, desconsiderando a classificação e o local.

Martijn
fonte
A documentação do MySQL explica isso perfeitamente. Existe uma razão para você não estar interessado em ver você mesmo?
siride
1
"Para compatibilidade com o PostgreSQL, o MySQL também suporta a sintaxe de deslocamento LIMIT row_count OFFSET." (em dev.mysql.com/doc/refman/5.5/en/select.html ).
siride
Porque isso ainda não responde às minhas perguntas. Pela sua citação (e pelo texto na página), devo concluir que o deslocamento é a mesma coisa que o limite, apenas escrito de forma diferente, como se o LIMIT fosse o seletor abreviado?
Martijn
1
é uma sintaxe diferente para expressar a mesma coisa. Suas outras sub-perguntas são completamente diferentes do título e da primeira parte do seu post.
siride
1
Entendo que, se for a mesma coisa, as outras consultas não serão efetuadas de maneira diferente em nenhuma das situações. Só não estava convencido de que era a mesma coisa, essa era a resposta que procurava, obrigado.
Martijn

Respostas:

9

Em termos de operação

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

não há absolutamente nenhuma diferença nas declarações

O comentário de @ siride é exatamente o ponto.

LIMIT 1000,25 significa LIMIT 25 OFFSET 1000

Da mesma documentação

LIMIT row_count é equivalente a LIMIT 0, row_count

SUAS PERGUNTAS REAIS

  • Isso realmente faz o mesmo ou meu entendimento está errado?
  • É um mais lento / mais rápido em tabelas maiores

Como as duas consultas são iguais, não há diferença

  • O resultado do deslocamento muda quando eu faço WHERE coluna = 1 (digamos que a coluna tenha> 100 valores diferentes)
  • O resultado da compensação é alterado quando eu faço o pedido ASC da coluna (assumindo que ele possui valores aleatórios)

O uso LIMITnão altera nenhum conjunto de resultados. Eles simplesmente navegam dentro do conjunto de resultados.

Esta consulta

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

seria diferente de

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

porque o LIMIT está sendo aplicado em um estágio diferente.

A primeira consulta não retornará nada se o nome da tabela tiver menos 1000 linhas

A segunda consulta não retornará nada se a subconsulta tiver menos de 1000 linhas

CONCLUSÃO

Você precisará esculpir a consulta para ter certeza de que está classificando os dados no estágio certo

RolandoMySQLDBA
fonte
1
Obrigado. O seguinte: "Não há absolutamente nenhuma diferença nas declarações" era exatamente o que eu estava procurando, e com essa informação eu posso ver que a classificação ou onde não importa. Foi não tenho certeza sobre kal foi a mesma coisa, e na codificação o diabo está nos detalhes, eu gostaria de saber com certeza :)
Martijn