Pedidos por id
probablemente usa un escaneo de índice agrupado mientras ordena por datetime
usa clasificación o búsqueda de índice.
Ambos métodos son más lentos que un escaneo de índice agrupado.
Si su tabla está agrupada por id
, básicamente significa que ya está ordenado. Los registros están contenidos en un B+Tree
que tiene una lista enlazada que enlaza las páginas en id
ordenar. El motor simplemente debe recorrer la lista enlazada para obtener los registros ordenados por id
.
Si el id
Los correos electrónicos se insertaron en orden secuencial, lo que significa que el orden físico de las filas coincidirá con el orden lógico y la exploración del índice agrupado será aún más rápida.
Si desea que sus registros se ordenen por datetime
, hay dos opciones:
- Tome todos los registros de la tabla y ordénelos. La lentitud es obvia.
- Usar el índice en
datetime
. El índice se almacena en un espacio separado del disco, lo que significa que el motor debe desplazarse entre las páginas de índice y las páginas de la tabla en un bucle anidado. También es más lento.
Para mejorar el orden, puede crear un índice de cobertura separado en datetime
:
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
e incluya todas las columnas que usa en su consulta en ese índice.
Este índice es como una copia oculta de su tabla, pero con los datos ordenados en un orden diferente.
Esto permitirá deshacerse de las búsquedas de claves (ya que el índice contiene todos los datos) que harán el pedido por datetime
tan rápido como eso en id
.
Actualización:
Una nueva entrada de blog sobre este problema: