Duda sobre ordenamiento de datos en Database

Iniciado por Skeletron, 16 Febrero 2010, 06:04 AM

0 Miembros y 1 Visitante están viendo este tema.

Skeletron

Hola gente..
Quiero saber en que se basa el ordenamiento de una base de datos...
Seguramente es por algun campo de la tabla.. pero:

Supongamos que ahgo un select con limit 50, pero sé que de resultado podria haber devuelto mas de 50 entradas.. entonces: esas 50 entradas, son las primeras 50 que devolvería tomando en cuenta el ordenamiento del "ORDER BY".. o el Order By es para ORDERNAR SOLAMENTE LOS RESULTADOS DEVUELTOS..

O sea:
El ORDER BY, Ordena la tabla y luego busca los resultados y los devuelve ordenados... O Devuelve los resultados Ordenados pero sin haberlos ordenado para devolverlos??? (notan la diferencia?)

Ejemplo:
Si tengo numeros en una base de datos así:
3
6
7
2
4
5
1
2

Y le hago un SELECT bla bla bla order by "NUMERO" LIMIT 5
Me devuelve:
1, 2, 2, 3, 4 (ordenó la tabla y luego seleccionó los primeros 5)
o
2, 3, 4, 6, 7 (tomo los primeros 5 y luego los ordenó)
?????



Otra pregunta:
Como puedo hacer para que un SELECT devuelva las entradas por "antiguedad", o sea.. LA PRIMERA ENTRADA QUE ENTRÓ A LA TABLA, QUE SEA DEVUELTA AL PRENCIPIO (siempre y cuando cumpla las condiciones del WHERE, obviamente)
O por defecto se devuelven asi?

Les pregunto ésto ultimo, porque tengo una base de datos donde voy agregando links, cadenas... y si me las devuelve por orden alfabetico, habrá cadenas que jamas se analizaran (las ultimas.. porque siempre llegarán nuevas que estaran antes en orden alfabetico)



Espero las respuestas gente!

Gracias!

^Tifa^

#1
Un tema con una respuesta un poco extensa   :xD

Te desgloso que tiene internamente el motor MySQL como tal :



Donde:

Connection Thread/Handling
Se refiere al conector que utilizas para acceder al motor mediante algun lenguaje de programacion (un modulo o jdbc tu entiendes).

Query Cache
Despues de conectarte y enviar tu consulta SQL en tu codigo, lo primero que MySQL hace es verificar su buffer cache (query cache) que guarda en una cache del motor todas las consultas SELECT (Tu consulta SQL pasa por aqui primeramente haber si ya se realizo y retorno datos anteriormente, asi se ahorra tener que realizar todo el proceso otra vez y saca todo de la cache...) Pero no en todas las ocasiones Query Cache esta habilitado en el motor.. y no del todo conviene habilitarlo tampoco... yo solo queria informarte que luego de conectarte, lo segundo que haces es pasar por la cache.

Parser
Sino hay nada en la cache similar a tu consulta SQL, entonces sigues al 'parser' del motor, aqui es donde este se encarga de buscar toda la informacion dentro de las tablas y organizarlas acorde al predicado (eso que pones despues de WHERE).

Obviare el punto del Optimizador y de los motores, ya que no haces referencia de que quieras usar EXPLAIN.

CitarEl ORDER BY, Ordena la tabla y luego busca los resultados y los devuelve ordenados... O Devuelve los resultados Ordenados pero sin haberlos ordenado para devolverlos??? (notan la diferencia?)

Depende.... si haces tu consulta a traves de un lenguaje (PHP, Perl, Python, Java, etc..) recuerda que si no utilizas funciones tipo mysql_ubbuffered_cache  o use_results  o similares, aqui tu consulta lo que hace es una especie de SELECT * al motor para que este retorne todos los registros disponibles y estos son guardados en la buffer cache del modulo o api que usa tu lenguaje para conectarse a MySQL, luego que tienes ahi guardado todos esos registros en el buffer de tu API es entonces ahi que este funciona como el parser de MySQL, aplica todo lo que viene despues del WHERE de tu consulta pero a los datos guardados en el buffer de tu API no de MySQL como tal. Ahora si haces la consulta usando las funciones mencionada anteriormente, o por el cliente de Mysql directamente, entonces aca se cumple todo lo expuesto mas arriba (lo de verificar query cache, parser, etc) y entonces dentro del motor (aunque esto es transparente para ti) se retorna toda la data pero al buffer cache del motor y entonces ahi actua el 'parser' y organiza todo y entonces retorna lo que pediste. Primero se obtiene todos los registros y luego que estan todos retornados es que se aplica lo que viene despues del WHERE, entonces podria decirse:

ORDER BY  busca en la tabla, obtiene los resultados y luego los ordena y los devuelve.

Esto funciona asi, es como cuando en un lenguaje de programacion abres un archivo de texto con mucha informacion, y dentro de tu lenguaje dices... sacame y ordename los registros que encuentres que empiezen por la letra 'A' lo primero que hace tu aplicacion obviamente es abrir el archivo de texto, leerlo por completo.. y despues de tener toda la info en memoria entonces procede a ir separando todos los que empiezan por la letra 'A'... el motor de base de datos hace el mismo proceso  ;)

Sobre tu segunda pregunta, generalmente hacen un rejuego con la clausula LIMIT por ejemplo si tienes una tabla con 100 registros, van haciendo en un bucle algo asi:

SELECT * FROM TABLA ORDER BY CAMPO1 LIMIT $numero, $numerito;

Donde $numero es una variable que digamos su valor inicial en su bucle es 90 y el valor inicial en el bucle de $numerito es 100, entonces la consulta te retornara los 10 ultimos registros de los 100 (digase los registros que van del 90 al 100) luego vas restando tu bucle y el valor de $numerito pasa a ser 90 y el de $numero 80  entonces ahora te retornara los registros del 80 al 90 y asi sucesivamente... (todo controlado a nivel de codigo en el lenguaje). La manera de ordenarlo como usaras ORDER BY y sino especificas si es ASC o DESC el por defecto lo hace de manera Ascendente, por ende si tu ultimo registro dice 1 y tu antepenultimo registro dice 2  el te ordenara todo colocando primero el 1 despues el 2.

Skeletron

Bien.. Me quedo claro.. Pero, a ver, resolveme este ejemplo:
Si tengo numeros en una base de datos así:
3
6
7
2
4
5
1
2

Un SELECT bla bla bla ODER BY "NUMERO" LIMIT 2, 5
Que numeros me devolvería? y como (el orden)?

Skeletron

Acabo de hacer unas pruebas.
Cuando haces un ORDER BY, primero "ORDENA TODA LA TABLA" y luego toma los registros ordenados. o sea.
Ejemplo:
Si tengo numeros en una base de datos así:
3
6
7
2
4
5
1
2

Y le hago un SELECT bla bla bla ORDER BY "NUMERO" LIMIT 5
Me devuelve:
1, 2, 2, 3, 4 (ordenó la tabla y luego seleccionó los primeros 5)

Por ENDE, si alguien quiere utilizar una base de datos, del modo FIFO, simplemente no utilice ORDER BY

^Tifa^

#4
Aja y tu que estas aplicando primero ORDER BY o LIMIT????  Pues ORDER BY  :xD  por ende ordena primero y entonces luego aplica la otra condicion que le sigue (si existen mas)

;)

Eso es asi.. primero recoge todos los datos, luego sigue a la primera condicion que es ORDER ordena y luego si hay mas sigue a la siguiente condicion que es LIMIT.

:P

Skeletron

Cita de: ^TiFa^ en 16 Febrero 2010, 18:28 PM
Aja y que va primero ORDER BY o LIMIT????

;)

Claro que debe ordenarlo primero..... y despues aplicar el limite...

Eso es asi.. primero recoge todos los datos, luego sigue a la primera condicion que es ORDER ordena y luego si hay mas sigue a la siguiente condicion que es LIMIT.

:P
No.. Primero ordena la tabla, luego recoje los datos que cumplan el WHERE, y luego de ellos toma los que se refiere el LIMIT

^Tifa^

Chico pero que hace esto:

CitarSELECT bla bla bla ORDER BY "NUMERO" LIMIT 5

SELECT CAMPO (recoge todos los registros de ese campo)
ORDER BY (verifica todos los registros ya tomados y los organiza en este caso ascendente)
LIMIT 5 (A los datos ya ordenados aplica esta ultima condicion)

Primero debe recoger todos los datos, para proceder a la segunda condicion ORDER BY y luego si existe proceder a la siguientes condiciones LIMIT.

Skeletron

Pero TIFA, mi duda era si primero respetaba el LIMIT, o el ORDER BY.. Y por lo visto, es el ORDER BY :D

Duda resuelta

^Tifa^

Es que nino (No te estoy ofendiendo que conste  ;) )

Tiene que respetar el ORDER BY porque va primero, es una condicion que va primero lo que tu no puedes aplicar es colocar ORDER BY despues del LIMIT  :xD  ni previamente al campo de los registros que se quieren obtener, digase tu no puedes hacer esto:

SELECT CAMPO LIMIT 5 ORDER BY CAMPO

o

SELECT ORDER BY CAMPO LIMIT 5

Porque por logica, no puedes ordenar unos datos sin primero haber obtenidos todos los datos, si te dan un archivo de texto y tu debes leerlo con tu aplicacion pero te dicen que de ese archivo solo quieren los nombres que comienzen con la letra 'A-F' por ejemplo... y tu archivo tiene nombres de la 'A-Z' que debes hacer primero para sacar esto?? leer todo el archivo completo, es ahi cuando tu aplicacion abre el archivo y lo lee completo primero (SELECT CAMPO) ya obtenido toda la info del archivo y temporalmente en memoria que haces para obtener todos los nombres ordenados de forma ascendente? aplicas un filtro (ORDER BY) y para finalizar supongamos que a ti solo te interesan de todos esos registros ya ordenados en memoria 10 (LIMIT).

Es lo mismo que ne programacion, leer todo, agrupar por una condicion y despues si existen mas condiciones cumplir las que siguen.