2011-12-13 9 views
6

Duplicar posibles:
Default sort-ordering in MySQL (ALTER TABLE … ORDER BY …;)orden por defecto de MySQL depende de dónde

Tengo una tabla como la siguiente:

CREATE TABLE IF NOT EXISTS `table_test` (
    `id` mediumint(8) unsigned NOT NULL, 
    `country` enum('AF','AX','AL') DEFAULT NULL, 
    `number` tinyint(3) unsigned DEFAULT NULL, 
    `sort_order` double unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `country` (`country`), 
    KEY `id` (`id`,`country`) 
) ENGINE=MEMORY DEFAULT CHARSET=latin1; 

Tengo una tabla en la que he cambiado el orden predeterminado como:

ALTER TABLE test_table ORDER BY sort_order ASC; 

Esta tabla nunca se actualiza y no se eliminan ni añaden registros durante su vida útil. Todo esto parece funcionar de modo que si yo uso la consulta folowwing:

SELECT * FROM test_table LIMIT 10 

Devuelve los 10 registros en el orden correcto.

E incluso si uso:

SELECT * FROM test_table WHERE num=3 

devuelve los resultados en el orden correcto.

Pero si lo hago

SELECT * FROM test_table WHERE country='AX' 

Se devolverá los resultados en orden inverso.

¿Puede alguien decirme cómo puede pasar esto?

+0

'country' está indexado y tal vez el índice' country' no está en el mismo orden que 'sort_order', o no está ordenado en absoluto. O en su caso, se ordenó de forma inversa inversa ... – Vili

+0

_ORDER BY no tiene sentido para las tablas InnoDB que contienen un índice agrupado definido por el usuario (PRIMARY KEY o NOT NULL UNIQUE index). InnoDB siempre ordena las filas de la tabla de acuerdo con dicho índice, si hay una presente._ - http://dev.mysql.com/doc/refman/5.1/en/alter-table.html - Sé que su motor de tabla es MEMORIA, aún Creo que el caso es el mismo. – Vili

+0

Esto parece ser similar a: http://stackoverflow.com/questions/725717/default-sort-ordering-in-mysql-alter-table-order-by .. excepto de documentos: tenga en cuenta que la tabla no permanece en este orden después de insertar y eliminar. Esta opción es útil principalmente cuando usted sabe que la mayoría de las veces debe consultar las filas en un cierto orden. Al usar esta opción después de realizar cambios importantes en la tabla, es posible que pueda obtener un mayor rendimiento. En algunos casos, puede hacer que la clasificación sea más fácil para MySQL si la tabla está en orden por la columna que desea ordenar más adelante ... Podría, no ... confíe en – xQbert

Respuesta

5

Especificar el ORDER BY en una tabla es solo una ayuda para que el motor acelere las consultas con el mismo orden. No forzará a mysql a devolver siempre el resultado con el mismo orden.

Descrito en esto:.. http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

"ORDER BY permite crear la nueva tabla con las filas en un orden específico Observe que la tabla no se queda en este orden después de inserciones y eliminaciones Esta opción es útil principalmente cuando usted sabe que generalmente debe consultar las filas en un orden determinado la mayor parte del tiempo. Al usar esta opción después de realizar cambios importantes en la tabla, es posible que pueda obtener un mejor rendimiento. En algunos casos, podría hacer que la clasificación sea más fácil. para MySQL si la tabla está en orden por la columna que desea pedir más tarde. "

Por lo tanto, debe usar la expresión ORDER BY en sus consultas también.

+0

+1 Y en caso de que no sea lo suficientemente claro: el concepto de * orden por defecto * no existe en el lenguaje SQL. Es intencional y por diseño. –

+0

IMO Mejor respuesta ya que los sitios las referencias del doc e indica rotundamente para agregar el orden a todas las consultas. – xQbert

+0

Esto no responde a la búsqueda por qué sucede. No quiero saber si es la forma preferida de hacerlo, pero necesito saber por qué el motor decide revertir el orden de clasificación. Además, la documentación no indica que deba usar ORDER BY en la consulta – Nin

1

por qué no intenta la consulta como la siguiente:

SELECT * FROM test_table ORDER BY sort_order ASC LIMIT 10; 
SELECT * FROM test_table WHERE num=3 ORDER BY sort_order ASC; 
SELECT * FROM test_table WHERE country='AX' ORDER BY sort_order ASC; 
+1

porque esa no es la pregunta. La pregunta es por qué MYSQL tiene una función en las tablas que permite una orden predeterminada si no funciona. (o por qué no está trabajando en su implementación – xQbert

+0

y sé que el orden debería funcionar en el conjunto de resultados. Escuché la primera vez que puedes hacer un pedido por en una declaración alternativa. Estoy tratando de leer sobre eso si obtengo una solución de lo que te haré saber .. –

3

supongo que el orden predeterminado de su índice en el país es la descripción. Debido a esto, si se usa esta, se obtiene el pedido "incorrecto" y en todos los demás casos es diferente. No estoy seguro si o cómo es posible especificar el orden del índice en mysql, pero creo que sí.

Pero todavía no estoy seguro si puede confiar en la orden si no especifica una. Simplemente agregue la instrucción ORDER BY a todas sus consultas.

+0

'Simplemente agrega la instrucción ORDER BY a todas tus consultas. Esta es la respuesta correcta. SQL ** never ** garantiza cualquier orden particular del conjunto de resultados a menos que uses un' ORDER BY' cláusula. No importa en qué orden se almacenan físicamente las filas en la tabla. – Hammerite

+0

Y MySQL ** no ** tiene índices 'DESC' –

1

La razón por la que ve este comportamiento es probablemente la siguiente: porque la cláusula WHERE filtra por country, MySQL usa el índice en country para encontrar las filas que se devolverán.Lo más probable es que las filas de índice se almacenen ordenadas por country, luego por id (la clave principal de la tabla). Esto significa que la forma más eficiente para que MySQL recupere las filas es leyendo las filas a las que hace referencia el índice, en el orden en que aparecen en el índice. El orden en que las filas aparecen en el disco es, por lo tanto, irrelevante.

MySQL proporciona la sintaxis que le permite especificar el orden de un índice, pero this is currently ignored:

Una especificación index_col_name puede acabar con ASC o DESC. Estas palabras clave están permitidas para futuras extensiones para especificar el almacenamiento de valor de índice ascendente o descendente. Actualmente, se analizan pero se ignoran; los valores de índice siempre se almacenan en orden ascendente.

Deberá agregar ORDER BY cláusulas a sus consultas para garantizar que las filas se devuelvan en el orden deseado. Por cierto, este es siempre el caso de todos modos; SQL no garantiza que las filas se devolverán en un orden particular, independientemente de cómo se almacenan físicamente las filas (a menos que exista una cláusula ORDER BY).

+0

. Si este fuera el caso, debería mostrar el orden de clasificación en orden aleatorio, pero se muestra perfectamente en orden DESC. – Nin

+1

El hecho de que no esté en el orden que desea no significa que esté en orden * al azar *. Está en el orden que MySQL considere más conveniente mostrarles. Cuando la tabla se organiza con las filas en orden DESC, sucede que ese orden coincide con el orden que desea. – Hammerite