En esencia, al usar ORDER BY implica que el o los campos que usaremos para ordenar no figuran en los índices usados por la tabla. De esto, MySQL deduce que no es posible establecer a priori cuantas lecturas se deberán hacer ni tampoco desde qué punto deben hacerse. Por ello tiene que realizar una lectura completa de la tabla a fin de ordenarla previamente antes de buscar la secuencia de datos pedida.
Simplificando:
- MySQL (SQL Server también lo hace) debe leer toda la tabla cuando se usa ordenamiento en una columna no indexada porque no puede establecer a priori la posición de los mismos.
- Ademá, si la tabla es reducida, puede darse que leer la tabla completa use la misma cantidad de bloques de memoria que usaría utilizando el índice con el agregado que al reordenar ya tiene los datos y no tiene que hacer un segundo acceso a disco para buscar los 50 registros.
- El tema del uso o no de índices INDEX o PRIMARY se ve no tanto en el barrido de la tabla como en la duración en segundos de la consulta. Verificá cuanto dura en ambos casos, luego desactiva el primario y probá otra vez. Una de las formas es la mejor. Hay que encontrarla.
- Un tip adicional es establecer si realmente necesitás una consulta del tipo:
es decir, una consulta que te traiga TODO. Usala solamente si vas a necesitar TODOS los datos, sino seleccioná los cámpos realmente útiles. El resto es basura en memoria y tiempo de procesador.