Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana Data dipesan di MySql secara Default

Di InnoDB , baris disimpan dalam urutan kunci utama. Jika Anda menggunakan LIMIT tanpa ORDER BY , Anda akan selalu mendapatkan baris dengan nilai kunci utama terendah, meskipun Anda memasukkannya dalam urutan acak.

create table foo (id int primary key, x char(1), y int) engine=InnoDB;
insert into foo values (5, 'A', 123);
insert into foo values (9, 'B', 234);
insert into foo values (2, 'C', 345);
insert into foo values (4, 'D', 456);
insert into foo values (1, 'E', 567);
select * from foo;
+----+------+------+
| id | x    | y    |
+----+------+------+
|  1 | E    |  567 |
|  2 | C    |  345 |
|  4 | D    |  456 |
|  5 | A    |  123 |
|  9 | B    |  234 |
+----+------+------+

Di MyISAM , baris disimpan di mana pun sesuai. Awalnya, ini berarti baris ditambahkan ke file data, tetapi saat Anda menghapus baris dan menyisipkan yang baru, celah yang ditinggalkan oleh baris yang dihapus akan digunakan kembali oleh baris baru.

create table bar (id int primary key, x char(1), y int) engine=MyISAM;
insert into bar values (1, 'A', 123);
insert into bar values (2, 'B', 234);
insert into bar values (3, 'C', 345);
insert into bar values (4, 'D', 456);
insert into bar values (5, 'E', 567);
select * from bar;
+----+------+------+
| id | x    | y    |
+----+------+------+
|  1 | A    |  123 |
|  2 | B    |  234 |
|  3 | C    |  345 |
|  4 | D    |  456 |
|  5 | E    |  567 |
+----+------+------+
delete from bar where id between 3 and 4;
insert into bar values (6, 'F', 678);
insert into bar values (7, 'G', 789);
insert into bar values (8, 'H', 890);
select * from bar;
+----+------+------+
| id | x    | y    |
+----+------+------+
|  1 | A    |  123 |
|  2 | B    |  234 |
|  7 | G    |  789 | <-- new row fills gap
|  6 | F    |  678 | <-- new row fills gap
|  5 | E    |  567 |
|  8 | H    |  890 | <-- new row appends at end
+----+------+------+

Kasus pengecualian lain jika Anda menggunakan InnoDB adalah jika Anda mengambil baris dari indeks sekunder, bukan dari indeks utama. Ini terjadi ketika Anda melihat catatan "Menggunakan indeks" di output EXPLAIN.

alter table foo add index (x);
select id, x from foo;
+----+------+
| id | x    |
+----+------+
|  5 | A    |
|  9 | B    |
|  2 | C    |
|  4 | D    |
|  1 | E    |
+----+------+

Jika Anda memiliki kueri yang lebih kompleks dengan gabungan, itu menjadi lebih rumit, karena Anda akan mendapatkan baris yang dikembalikan dengan urutan default dari tabel pertama yang diakses (di mana "pertama" bergantung pada pengoptimal memilih urutan tabel), lalu baris dari tabel yang digabungkan akan tergantung pada urutan baris dari tabel sebelumnya.

select straight_join foo.*, bar.* from bar join foo on bar.x=foo.x;
+----+------+------+----+------+------+
| id | x    | y    | id | x    | y    |
+----+------+------+----+------+------+
|  1 | E    |  567 |  5 | E    |  567 |
|  5 | A    |  123 |  1 | A    |  123 |
|  9 | B    |  234 |  2 | B    |  234 |
+----+------+------+----+------+------+

select straight_join foo.*, bar.* from foo join bar on bar.x=foo.x;
+----+------+------+----+------+------+
| id | x    | y    | id | x    | y    |
+----+------+------+----+------+------+
|  5 | A    |  123 |  1 | A    |  123 |
|  9 | B    |  234 |  2 | B    |  234 |
|  1 | E    |  567 |  5 | E    |  567 |
+----+------+------+----+------+------+

Intinya adalah yang terbaik adalah eksplisit:ketika Anda menggunakan LIMIT , tentukan ORDER BY .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa menggunakan JSON_EXTRACT di MySQL dan mendapatkan string tanpa tanda kutip?

  2. Pilih dari tabel di mana bidang tidak cocok dengan kondisi

  3. Mengubah ini dari MySQL ke MySQLi?

  4. MySQL pilih DISTINCT dengan nilai tertinggi

  5. Serangan injeksi SQL dengan php