Una de Mysql

Alvaro Herrera alvherre en dcc.uchile.cl
Mie Jun 23 21:13:41 CLT 2004


On Wed, Jun 23, 2004 at 05:48:01PM -0400, Horst von Brand wrote:
> Juan Carlos Inostroza <jci en tux.cl> dijo:
> 
> > Segun se, la clausula order by es para los selects. Y efectivamente,
> > cuando agregas un registro este queda al final de la tabla. 
> 
> En terminos logicos, lo agrega a la tabla, que es un _conjunto_ (no hay
> orden!). Que la implemente en forma secuencial es puramente
> conincidencia... estoy seguro que si borras cosas del medio, reusa la
> posicion tambien. Y si tiene claves (y es menos que _totalmente_ idiota)
> usara hashing internamente (y es seguro que otra version usara un orden
> distinto, etc).

Y no solo eso, sino que ademas un mecanismo para extraer las filas de la
tabla puede dar resultados distintos a otro.  Por ejemplo, si se usa un
recorrido de indice lo mas probable es que se obtengan en el orden del
indice; si se usa un recorrido secuencial del heap, lo mas probable es
que se obtengan en el orden fisico.

Por ejemplo, otra implementacion puede hacer un recorrido del indice
completo y luego ordenar los identificadores segun la posicion del heap,
para optimizar los movimientos de los cabezales del disco.  En este caso
el orden puede ser distinto a los dos anteriores.


Cuando Postgres introdujo el concepto de "hash-based aggregation" (en la
version 7.4) mucha gente se quejo de que los resultados ya no se
entregaban en orden, como antes.  Que no te suceda esto!

Con respecto a lo de que al agregar un registro queda al final de la
tabla, esto no es necesariamente asi: por ejemplo en Postgres al hacer
recoleccion de basura puede quedar espacio libre en paginas al principio
de la tabla, y nuevas tuplas se insertaran en ese espacio.

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"The eagle never lost so much time, as
when he submitted to learn of the crow." (William Blake)



Más información sobre la lista de distribución Linux