MEMORY depolama motoruna gelince , sıralamanın ekleme sırasına göre olmasını beklerdim çünkü varsayılan dizin düzeni HASH
yerine dizini oluşturuyordu BTREE
ve dizin düzeninin hiçbir yönü kullanılmıyordu. K dizini oluşturduğunuz ve k aynı değer olduğundan, tüm anahtarlar aynı karma kepçeye girer . Bir karma kepçeyi doldurmak için daha fazla karmaşıklık varsaymak için bir neden olmadığından, yerleştirme sırası en anlamlı olanıdır.
Aynı örnek tabloyu ve veriyi INSERT
aldım , 30 saniye koştum ve şunu aldım:
mysql> use test
Database changed
mysql> drop table if exists t;
Query OK, 0 rows affected (0.00 sec)
mysql> create table t(k int, v int,index k(k)) engine=memory;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t values
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3);
Query OK, 30 rows affected (0.00 sec)
Records: 30 Duplicates: 0 Warnings: 0
mysql> select * from t;
+------+------+
| k | v |
+------+------+
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
+------+------+
30 rows in set (0.00 sec)
mysql>
K: 10 ve 11 için iki farklı değer eklemeye karar verdim.
mysql> use test
Database changed
mysql> drop table if exists t;
Query OK, 0 rows affected (0.02 sec)
mysql> create table t(k int, v int,index k(k)) engine=memory;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t values
-> (11, 1), (11, 2), (11, 3), (10, 1), (10, 2), (10, 3),
-> (11, 1), (11, 2), (11, 3), (10, 1), (10, 2), (10, 3),
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3);
Query OK, 30 rows affected (0.00 sec)
Records: 30 Duplicates: 0 Warnings: 0
mysql> select * from t;
+------+------+
| k | v |
+------+------+
| 11 | 1 |
| 11 | 2 |
| 11 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 11 | 1 |
| 11 | 2 |
| 11 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
+------+------+
30 rows in set (0.00 sec)
mysql>
Takma sırasına benziyor. k = 11 ilk anahtarın ardından 10'du. 11 yerine ilk 10'u eklemeye ne dersiniz? Elimde bu var:
mysql> use test
Database changed
mysql> drop table if exists t;
Query OK, 0 rows affected (0.02 sec)
mysql> create table t(k int, v int,index k(k)) engine=memory;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t values
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
-> (11, 1), (11, 2), (11, 3), (10, 1), (10, 2), (10, 3),
-> (11, 1), (11, 2), (11, 3), (10, 1), (10, 2), (10, 3),
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3),
-> (10, 1), (10, 2), (10, 3), (10, 1), (10, 2), (10, 3);
Query OK, 30 rows affected (0.00 sec)
Records: 30 Duplicates: 0 Warnings: 0
mysql> select * from t;
+------+------+
| k | v |
+------+------+
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 11 | 1 |
| 11 | 2 |
| 11 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 11 | 1 |
| 11 | 2 |
| 11 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
+------+------+
30 rows in set (0.00 sec)
mysql>
Oybirliği var !!! YALITIM SİPARİŞİ cevaptır.
MEMORY depolama motoru için dizinleri kullanmaya ilişkin Sidenotes
MEMORY için yapılan aralık aramaları, nispeten korkunç bir performansa sahip olacaktır.
Bir dizin oluştururken, dizinin USING BTREE
tanımı ile birlikte yan tümce belirtebilirsiniz . Bu, aralık sorguları için işleri geliştirir.
Belirli bir satır için arama yapmak, ya HASH
da ile aynı performansı verir BTREE
.
GÜNCELLEME 2011-09-22 11:18 EDT
Bugün ilginç bir şey öğrendim. @Laurynas Biveinis tarafından Percona'dan sağlanan bağlantıyı okudum: Percona bağlantısı MySQL 5.5.15 için MEMORY tabloları hakkında bir şeyler söylüyor :
Satır Siparişi
SİPARİŞ BY yokluğunda, kayıtları önceki MEMORY uygulamasından farklı bir sırayla iade edilebilir. Bu bir hata değil. Bir ORDER BY deyimi olmadan belirli bir siparişe dayanan herhangi bir uygulama beklenmeyen sonuçlar verebilir. ORDER BY olmadan belirli bir düzen, küçük MySQL sürümleri arasında değişebilecek ve değişecek olan bir depolama motorunun ve sorgu iyileştirici uygulamasının bir yan etkisidir.
Bu, bugün görmem için iyi bir bağlantıydı. Verdiğim cevap, yüklediğim tablonun MySQL 5.5.12'de BUGÜN beklemesini beklemek amacıyla alındığını gösterdi. Percona ve @Laurynas Biveinis’in işaret ettiği gibi , başka bir küçük sürümde garanti yoktur.
Bu yüzden cevabımı savunmaya çalışmak yerine, @Laurynas Biveinis'in cevabını yükseltmeyi tercih ederim çünkü en güncel bilgi bu. @Laurynas Biveinis için şeref ve şapkalar . @Eevar'a , sorulara versiyona özel cevaplar vermemeyi kibarca gösterdiği için teşekkür ediyorum . İkisi de bugün benim oyumu alıyor.