sql >> Base de Datos >  >> RDS >> Mysql

Consulta MySQL con límite y gran compensación que tarda una eternidad

LIMIT con un desplazamiento es extremadamente lento en la mayoría de las bases de datos (he encontrado algunos documentación a este efecto para MySQL y estoy tratando de encontrar un artículo realmente bueno que leí hace un tiempo explicando esto para SQLite). La razón es que generalmente se implementa algo como esto:

  1. Realice toda la planificación normal de consultas como si el LIMIT la cláusula no estaba allí
  2. Recorra los resultados hasta que lleguemos al índice que desea
  3. Empezar a mostrar resultados

Qué significa esto si haces LIMIT 10000, 10 , se interpretará como:

  1. Obtener los primeros 10.000 resultados e ignorarlos
  2. Darte los próximos 10 resultados

Hay una optimización trivial en la que al menos puede usar el índice para los primeros 10 000 resultados, ya que no le importan sus valores, pero incluso en ese caso, la base de datos aún necesita recorrer 10 000 valores de índice antes de brindarle sus 10 resultados. Puede haber más optimizaciones que puedan mejorar esto, pero en el caso general no desea usar LIMIT con un desplazamiento para valores grandes .

La forma más eficiente de manejar la paginación que conozco es realizar un seguimiento del último índice, por lo que si la página uno termina en id = 5 , luego haga su siguiente el enlace tiene WHERE id > 5 (con un LIMIT x por supuesto).

EDITAR:Encontré el artículo para SQLite . Le recomiendo que lea esto, ya que explica The Right Way™ para hacer cosas en SQL. Dado que la gente de SQLite es realmente inteligente y otras bases de datos tienen el mismo problema, supongo que MySQL lo implementa de manera similar.