Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta MySQL com limite e grande deslocamento demorando uma eternidade


LIMIT com um deslocamento é extremamente lento na maioria dos bancos de dados (encontrei alguns documentação para este efeito para o MySQL e estou tentando encontrar um artigo muito bom que li há um tempo atrás explicando isso para o SQLite). A razão é que geralmente é implementado algo assim:
  1. Faça todo o planejamento de consulta normal como se o LIMIT cláusula não estava lá
  2. Percorra os resultados até chegarmos ao índice desejado
  3. Comece a retornar resultados

O que isso significa se você fizer LIMIT 10000, 10 , será interpretado como:
  1. Pegue os primeiros 10.000 resultados e ignore-os
  2. Dar a você os próximos 10 resultados

Há uma otimização trivial em que você pode pelo menos usar o índice para os primeiros 10.000 resultados, já que não se importa com seus valores, mas mesmo nesse caso, o banco de dados ainda precisa percorrer 10.000 valores de índice antes de fornecer seus 10 resultados. Pode haver outras otimizações que podem melhorar isso, mas no caso geral você não quer usar LIMIT com um deslocamento para valores grandes .

A maneira mais eficiente de lidar com a paginação que conheço é acompanhar o último índice, portanto, se a página um terminar em id = 5 , faça seu próximo link tem WHERE id > 5 (com um LIMIT x é claro).

EDIT:Encontrei o artigo para SQLite . Eu recomendo que você leia isso, pois explica The Right Way™ para fazer coisas em SQL. Como o pessoal do SQLite é muito inteligente e outros bancos de dados têm esse mesmo problema, suponho que o MySQL implemente isso de maneira semelhante.