Ketika datang ke mesin penyimpanan MEMORY , saya akan mengharapkan urutan dengan urutan penyisipan karena tata letak indeks default HASH
bukan BTREE
dan aspek tata letak indeks tidak digunakan. Karena Anda mengindeks k, dan k adalah nilai yang sama, semua kunci masuk ke ember hash yang sama . Karena tidak ada alasan untuk mengasumsikan kerumitan tambahan untuk mengisi hash bucket, urutan penyisipan paling masuk akal.
Saya mengambil tabel sampel dan data yang sama dan menjalankan 30 INSERT
detik dan saya mendapatkan ini:
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>
Saya memutuskan untuk menguji menambahkan dua nilai berbeda untuk k: 10 dan 11 saya mendapatkan ini:
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>
Sepertinya urutan penyisipan. k = 11 adalah hash kunci pertama kemudian 10. Bagaimana dengan menyisipkan 10 pertama alih-alih 11? Inilah yang saya dapat:
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>
Dengan suara bulat !!! ORDER OF INSERTION adalah jawabannya.
Sidenotes menggunakan indeks untuk mesin penyimpanan MEMORY
Pencarian rentang untuk MEMORY akan memiliki kinerja yang mengerikan.
Saat membuat indeks, Anda dapat menentukan USING BTREE
klausa bersama dengan definisi indeks. Ini akan meningkatkan hal-hal untuk kueri rentang.
Mencari baris tertentu akan menghasilkan hasil yang sama dalam kinerja baik dengan HASH
atau BTREE
.
UPDATE 2011-09-22 11:18 EDT
Saya belajar sesuatu yang menarik hari ini. Saya membaca tautan yang disediakan oleh @Laurynas Biveinis dari Percona: Tautan Percona mengatakan sesuatu tentang tabel MEMORY untuk MySQL 5.5.15 :
Pemesanan Baris
Dengan tidak adanya ORDER BY, catatan dapat dikembalikan dalam urutan yang berbeda dari implementasi MEMORY sebelumnya. Ini bukan bug. Aplikasi apa pun yang mengandalkan pesanan tertentu tanpa klausa ORDER BY dapat memberikan hasil yang tidak terduga. Pesanan khusus tanpa ORDER BY adalah efek samping dari mesin penyimpanan dan penerapan optimizer kueri yang mungkin dan akan berubah antara rilis MySQL kecil.
Ini adalah tautan yang baik untuk saya lihat hari ini. Jawaban yang saya berikan menunjukkan bahwa tabel yang saya muat diambil agar saya harapkan HARI INI di MySQL 5.5.12. Seperti yang baru saja ditunjukkan oleh Percona dan @Laurynas Biveinis , tidak ada jaminan dalam rilis kecil lainnya.
Jadi, daripada mencoba membela jawaban saya, saya lebih suka mempromosikan jawaban dari @Laurynas Biveinis karena ini adalah info terbaru. Kudos dan topi untuk @Laurynas Biveinis . Saya juga ingin mengucapkan terima kasih kepada @eevar dengan sopan menunjukkan tidak mempromosikan jawaban versi khusus untuk pertanyaan. Mereka berdua mendapatkan upvote saya hari ini.