2011-12-13 24 views
6

Eventuali duplicati:
Default sort-ordering in MySQL (ALTER TABLE … ORDER BY …;)MySQL ordine predefinito dipende da dove

Ho una tabella come questa:

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; 

Ho una tabella per la quale ho cambiato il ordinamento predefinito come:

ALTER TABLE test_table ORDER BY sort_order ASC; 

Questa tabella non viene mai aggiornata e nessun record viene rimosso o aggiunto durante la sua vita. Tutto questo sembra funzionare così se uso la query folowwing:

SELECT * FROM test_table LIMIT 10 

Esso restituisce i 10 record nel giusto ordine.

E anche se uso:

SELECT * FROM test_table WHERE num=3 

restituisce i risultati nel giusto ordine.

Ma se faccio

SELECT * FROM test_table WHERE country='AX' 

Si restituirà i risultati in ordine inverso.

Qualcuno può dirmi come può accadere?

+0

'country' è indicizzato e forse l'indice' country' non è nello stesso ordine di 'sort_order', o non è ordinato affatto. O nel tuo caso è invertito accidentalmente ordinato ... – Vili

+0

_ORDER BY non ha senso per le tabelle InnoDB che contengono un indice cluster definito dall'utente (PRIMARY KEY o NOT NULL UNIQUE index). InnoDB ordina sempre le righe della tabella in base a tale indice se ne è presente uno._ - http://dev.mysql.com/doc/refman/5.1/en/alter-table.html - So che il tuo motore di tabella è MEMORY, eppure Penso che il caso sia lo stesso. – Vili

+0

Questo sembra essere simile a: http://stackoverflow.com/questions/725717/default-sort-ordering-in-mysql-alter-table-order-by .. tranne dai documenti: si noti che la tabella non rimane in questo ordine dopo gli inserimenti e le eliminazioni. Questa opzione è utile soprattutto quando sai che per la maggior parte del tempo devi principalmente interrogare le righe in un certo ordine. Usando questa opzione dopo importanti modifiche alla tabella, potresti essere in grado di ottenere prestazioni più elevate. In alcuni casi, potrebbe rendere l'ordinamento più facile per MySQL se la tabella è in ordine dalla colonna che si desidera ordinare in un secondo momento ... Potrebbe, Maggio ... non fare affidamento su – xQbert

risposta

5

Specificare l'ordine BY su un tavolo è solo un aiuto per il motore per velocizzare le query con lo stesso ordine. Non imporrà a mysql di restituire sempre il risultato con lo stesso ordine.

Descritto in questo modo:.. http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

"ORDER BY consente di creare la nuova tabella con le righe in un ordine specifico noti che la tabella non rimane in questo ordine dopo inserti e cancella Questa opzione è utile soprattutto quando sai che per la maggior parte del tempo devi principalmente interrogare le righe in un certo ordine: utilizzando questa opzione dopo importanti modifiche alla tabella, potresti essere in grado di ottenere prestazioni più elevate. In alcuni casi, potrebbe rendere più facile l'ordinamento per MySQL se la tabella è in ordine per la colonna che si desidera ordinare più tardi. "

Quindi è necessario utilizzare l'espressione ORDER BY anche nelle query.

+0

+1 E nel caso in cui non è abbastanza chiaro: il concetto di * ordine predefinito * non esiste nel linguaggio SQL È intenzionale e di progettazione –

+0

IMO Risposta migliore poiché i riferimenti dei documenti del sito sono indicativi e indicano l'ordine per tutte le query – xQbert

+0

Questo non risponde alla ricerca perché capita Non voglio sapere se è il modo migliore per farlo, ma ho bisogno di sapere perché il motore decide di invertire l'ordine di smistamento. Inoltre, la documentazione non afferma che dovrei usare ORDER BY nella query – Nin

1

perché non si tenta la query come questa:

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

perché non è questa la domanda. la domanda è perché MYSQL ha una funzione sulle tabelle che consente un ordine predefinito se non funziona. (o perché non sta funzionando nella loro implementazione – xQbert

+0

beh, per quanto ne so l'ordine dovrebbe funzionare sul set di risultati Ho sentito la prima volta che si può fare ordine in alter dichiarazioni. Sto cercando di leggerlo se ottengo una soluzione di quanto farò sapere ... –

3

Credo che l'ordine di default del vostro indice su paese è DESC. Per questo, se si usa questo, si ottiene l'ordine "sbagliato" e in tutti gli altri casi è diverso. Non sono sicuro se o come sia possibile specificare l'ordine dell'indice in mysql, ma penso che lo sia.

Ma ancora non sono sicuro se è possibile fare affidamento sull'ordine se non si specifica uno. Basta aggiungere l'istruzione ORDER BY a tutte le tue domande.

+0

'Basta aggiungere l'istruzione ORDER BY a tutte le tue domande.Questa è la risposta corretta SQL ** mai ** garantisce un particolare ordinamento del set di risultati a meno che tu non usi un' ORDER BY' clausola.Non importa quale ordine le file sono fisicamente memorizzate nella tabella – Hammerite

+0

E MySQL fa ** non ** ha indici 'DESC'. –

1

Il motivo per cui viene visualizzato questo comportamento è probabilmente il seguente: poiché la clausola WHERE filtra per country, MySQL utilizza l'indice su country per trovare le righe da restituire.Molto probabilmente le righe indice vengono archiviate ordinate per country, quindi per id (la chiave primaria della tabella). Ciò significa che il modo più efficiente con cui MySQL recupera le righe è leggendo le righe a cui fa riferimento l'indice, nell'ordine in cui appaiono nell'indice. L'ordine di visualizzazione delle righe sul disco è quindi irrilevante.

MySQL non fornisce la sintassi che consente di specificare l'ordine di un indice, ma this is currently ignored:

Una specifica index_col_name può terminare con ASC o DESC. Queste parole chiave sono consentite per le estensioni future per la specifica dell'archiviazione del valore dell'indice ascendente o discendente. Attualmente vengono analizzati ma ignorati; i valori dell'indice sono sempre memorizzati in ordine crescente.

È necessario aggiungere le clausole ORDER BY alle query per garantire che le righe vengano restituite nell'ordine desiderato. Per inciso, questo è sempre il caso comunque; SQL non garantisce che le righe vengano restituite in un ordine particolare, indipendentemente dal modo in cui le righe vengono archiviate fisicamente (a meno che non sia presente una clausola ORDER BY).

+0

Se questo fosse il caso dovrebbe mostrare l'ordine_ordine in ordine casuale ma lo mostra perfettamente nell'ordine DESC. – Nin

+1

Solo perché non è nell'ordine desiderato, non significa che è in ordine * random *. È in qualsiasi ordine che MySQL trovi più comodo mostrarglielo. Quando la tabella è disposta con le righe in ordine DESC, accade proprio che quell'ordine coincida con l'ordine che si desidera. – Hammerite