2011-12-13 16 views
6

Olası Çoğalt:MySQL varsayılan sipariş bağlıdır NEREDE

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; 

Değiştiğimi kendisi için bir tablo vardır:
Default sort-ordering in MySQL (ALTER TABLE … ORDER BY …;)

Böyle bir tablo var varsayılan sipariş gibi:

ALTER TABLE test_table ORDER BY sort_order ASC; 

Bu tablo hiçbir zaman güncellenmez ve ömrü boyunca herhangi bir kayıt silinmez veya eklenemez.

SELECT * FROM test_table LIMIT 10 

Doğru sırayla 10 kayıtları döndürür: Bu, tüm ı folowwing sorgusu kullanmak eğer öyleyse çalışıyor gibi görünüyor.

Ve kullansanız bile:

SELECT * FROM test_table WHERE num=3 

doğru sırayla sonuçları döndürür. Ben

SELECT * FROM test_table WHERE country='AX' 

yaparsanız

Ama O ters sırayla sonuçları döndürür.

Birisi bunun nasıl olabileceğini söyleyebilir mi?

+0

'country' endeksli ve belki de' country' endeksi 'sort_order' ile aynı sırada değil veya hiç sipariş edilmiyor. Ya da sizin durumunuzda yanlışlıkla tersine döndürülür ... – Vili

+0

_ORDER BY, kullanıcı tanımlı kümelenmiş bir dizin (PRIMARY KEY veya NOT NULL UNIQUE dizinini) içeren InnoDB tabloları için anlam ifade etmez. InnoDB, her zaman mevcutsa, böyle bir endekse göre tablo satırlarını sipariş eder - http://dev.mysql.com/doc/refman/5.1/en/alter-table.html - Masanızın motorunun MEMORY olduğunu biliyorum. Bence durum aynı. – Vili

+0

Bu, şunun gibi görünüyor: http://stackoverflow.com/questions/725717/default-sort-ordering-in-mysql-alter-table-order-by .. docs dışında: tablonun kalmayacağını unutmayın. bu sırayla ekler ve siler. Bu seçenek, çoğunlukla satırların çoğu zaman belirli bir sırada sorguladığınızı bildiğinizde yararlıdır. Bu seçeneği, tablodaki büyük değişikliklerden sonra kullanarak daha yüksek performans elde edebilirsiniz. Bazı durumlarda, eğer tablo, daha sonra sipariş etmek istediğiniz sütun tarafından sıralıysa, MySQL için sıralama daha kolay hale getirebilir ... Might, Mayıs ... – xQbert

cevap

5

Bir tablodaki SİPARİŞ BY'i belirtmek, motorun sorguları aynı sırayla hızlandırması için yalnızca bir yardımcıdır. Mysql'i daima sonucu aynı siparişle döndürmeye zorlamaz. Bu Açıklandığı

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

"SİPARİŞ BY belirli bir sırayla satırlarla yeni bir tablo oluşturmak için tablo ekler sonra bu sırada kalır ve siler unutmayın sağlayan bu seçenek kullanışlıdır Öncelikle satırları çoğunlukla belirli bir sıraya göre sorguladığınızı bildiğiniz zaman, bu seçeneği büyük değişiklikler yaptıktan sonra, daha yüksek performans elde edebilirsiniz. Bazı durumlarda, sıralama daha kolay olabilir MySQL için tablo, daha sonra sipariş etmek istediğiniz sütun tarafından sırayla. "

Sorgularınızda da ORDER BY ifadesini kullanmanız gerekir.

+0

+1 Ve yeterince açık olmaması durumunda: * varsayılan sipariş * kavramı SQL dilinde mevcut değil.Kesinlikle ve tasarım gereğince. –

+0

IMO Daha iyi cevaplar, dokümanın onları referans aldığı ve tüm sorgulara göre sipariş eklemenin tam olduğunu gösterdiği için daha iyi bir yanıt. – xQbert

+0

Bu sorulara cevap vermiyor. iyon neden olur. Bunu yapmak için tercih edilen bir yol olup olmadığını bilmek istemiyorum ama motorun sıralama düzenini tersine çevirmeye nasıl karar verdiğini bilmem gerekiyor. Ayrıca, belgeleme, – Nin

1

neden sorgu böyle deneyin:

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

güvenmeyin çünkü bu soru değil. Soru, MYSQL'in neden çalışmazsa, varsayılan siparişe izin veren tablolarda bir özelliğe sahip olmasının nedenidir. (ya da neden uygulamada çalıştığı kadarıyla değil – xQbert

+0

uygulamalarında çalışıyorum, sonuç kümesinde çalışmalıyım. 1 kez, alter deyimiyle siparişte bulunabileceğinizi duydum. Çözüm alsam bunu okumaya çalışıyorum. bilmiyorum .. –

3

Ben ülkeye endeksinize varsayılan sırasını tahmin DESC olduğunu. Bundan dolayı, eğer bu kullanılmışsa "yanlış" emri alırsınız ve diğer tüm durumlarda farklıdır. Mysql içinde dizinin sırasını belirtmek mümkün veya nasıl mümkün olduğundan emin değilim, ama bence.

Ancak, belirtmemeniz durumunda siparişe güvenebileceğinizden emin değilim. Tüm sorgularınıza sadece ORDER BY ifadesini ekleyin.

+0

'Sadece tüm sorgularınıza ORDER BY deyimini ekleyin. 'Bu doğru cevaptır. Satırların fiziksel olarak hangi sıraya yerleştirildiği önemli değil. – Hammerite

+0

Ve MySQL ** "DESC" indeksine sahip değil. –

1

Bu davranışı görmenizin nedeni muhtemelen aşağıdaki gibidir: WHERE maddenin country tarafından filtrelenmesi nedeniyle, MySQL, döndürülecek satırları bulmak için country dizinini kullanır.Büyük olasılıkla, dizin satırları country, sonra id (tablonun birincil anahtarı) tarafından sıralanır. Bu, MySQL'in satırları almak için en etkili yolunun, endekste göründükleri sıraya göre indekste listelendikleri sıraya göre okunmasıdır. Satırların diskte göründüğü sıra, bu nedenle ilgisizdir.

MySQL Eğer bir dizin sırasını belirlemek için izin sözdizimi sağlar, ancak this is currently ignored:

Bir index_col_name şartname ASC veya DESC ile sona erebilir. Bu anahtar kelimelere, artan veya azalan dizin değeri depolamasını belirtmek için gelecekteki uzantılar için izin verilir. Şu anda bunlar ayrıştırılıyor, ancak yok sayılıyor; indeks değerleri her zaman artan sırada depolanır.

Satırların istenilen sırayla döndürülmesini sağlamak için sorgularınıza ORDER BY tümceyi eklemeniz gerekir. Bu arada, bu her zaman böyle bir durumdur; SQL, satırların fiziksel olarak nasıl depolandığına bakılmaksızın (ORDER BY maddesi mevcut değilse) satırların belirli bir sırayla döndürüleceğine dair hiçbir garanti vermez.

+0

sorgusunda ORDER BY kullanmam gerektiğini belirtmiyorsa, bu durumda sort_order'i rastgele sırayla göstermesi gerekir, ancak DESC düzeninde mükemmel şekilde gösterir. – Nin

+1

Sadece istediğiniz sıraya girmediğinden, bunun * rastgele * olduğu anlamına gelmez. MySQL'in size göstermesi en uygun olanı budur. Tablo, DESC düzenindeki satırlarla düzenlendiğinde, bu sıra, istediğiniz sırayla çakışır. – Hammerite

İlgili konular