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

Apa urutan baris MySQL untuk SELECT * FROM table_name;?

Tidak, tidak ada jaminan. Kecuali Anda menentukan pesanan menggunakan ORDER BY klausa, urutannya sepenuhnya tergantung pada detail implementasi internal. Yaitu. apa pun yang paling nyaman untuk mesin RDBMS.

Dalam praktiknya, baris mungkin dikembalikan dalam urutan penyisipan aslinya (atau lebih tepatnya urutan baris yang ada dalam penyimpanan fisik), tetapi Anda tidak boleh bergantung pada ini. Jika Anda mem-port aplikasi ke merek RDBMS lain, atau bahkan jika Anda mengupgrade ke versi MySQL yang lebih baru yang mungkin mengimplementasikan penyimpanan secara berbeda, baris dapat kembali dalam urutan lain.

Poin terakhir ini berlaku untuk semua RDBMS yang sesuai dengan SQL.

Berikut adalah demonstrasi tentang apa yang saya maksud dengan urutan baris yang ada dalam penyimpanan, versus urutan pembuatannya:

CREATE TABLE foo (id SERIAL PRIMARY KEY, bar CHAR(10));

-- create rows with id 1 through 10
INSERT INTO foo (bar) VALUES
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing'), 
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing');

DELETE FROM foo WHERE id BETWEEN 4 AND 7;

+----+---------+
| id | bar     |
+----+---------+
|  1 | testing |
|  2 | testing |
|  3 | testing |
|  8 | testing |
|  9 | testing |
| 10 | testing |
+----+---------+

Jadi sekarang kita memiliki enam baris. Penyimpanan pada titik ini berisi celah antara baris 3 dan 8, yang tersisa setelah menghapus baris tengah. Menghapus baris tidak mendefrag celah ini.

-- create rows with id 11 through 20 
INSERT INTO foo (bar) VALUES
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing'), 
  ('testing'), ('testing'), ('testing'), ('testing'), ('testing');

SELECT * FROM foo;

+----+---------+
| id | bar     |
+----+---------+
|  1 | testing |
|  2 | testing |
|  3 | testing |
| 14 | testing |
| 13 | testing |
| 12 | testing |
| 11 | testing |
|  8 | testing |
|  9 | testing |
| 10 | testing |
| 15 | testing |
| 16 | testing |
| 17 | testing |
| 18 | testing |
| 19 | testing |
| 20 | testing |
+----+---------+

Perhatikan bagaimana MySQL telah menggunakan kembali ruang yang dibuka dengan menghapus baris, sebelum menambahkan baris baru ke akhir tabel. Perhatikan juga bahwa baris 11 hingga 14 disisipkan di ruang ini dalam urutan terbalik, mengisi dari ujung ke belakang.

Oleh karena itu, urutan penyimpanan baris tidak persis seperti urutan penyisipannya.

UPDATE:Demonstrasi ini saya tulis pada tahun 2009 adalah untuk MyISAM. InnoDB mengembalikan baris dalam urutan indeks kecuali Anda menggunakan ORDER BY. Ini adalah bukti lebih lanjut dari poin di awal jawaban bahwa urutan default tergantung pada implementasinya. Menggunakan mesin penyimpanan yang berbeda berarti penerapan yang berbeda.



  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 daftar memiliki data id yang sama dengan loop sementara di PHP?

  2. Apa perbedaan antara utf8_general_ci dan utf8_unicode_ci?

  3. Haruskah MySQL mengatur zona waktunya ke UTC?

  4. Instal Innotop untuk Memantau Kinerja Server MySQL

  5. Menggunakan Python dan MySQL dalam Proses ETL:Menggunakan Python dan SQLAlchemy