Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Thứ tự hàng MySQL cho SELECT * FROM tên_bảng;?

Không, không có gì đảm bảo. Trừ khi bạn chỉ định một đơn đặt hàng bằng ORDER BY điều khoản, thứ tự hoàn toàn phụ thuộc vào chi tiết triển khai nội bộ. I E. bất kỳ điều gì thuận tiện nhất cho công cụ RDBMS.

Trên thực tế, các hàng có thể được trả lại theo thứ tự chèn ban đầu của chúng (hoặc chính xác hơn là thứ tự mà các hàng tồn tại trong bộ nhớ thực), nhưng bạn không nên phụ thuộc vào điều này. Nếu bạn chuyển ứng dụng của mình sang một thương hiệu RDBMS khác hoặc thậm chí nếu bạn nâng cấp lên phiên bản MySQL mới hơn có thể triển khai bộ nhớ khác nhau, các hàng có thể quay trở lại theo một số thứ tự khác.

Điểm thứ hai đúng với bất kỳ RDBMS nào tương thích với SQL.

Dưới đây là minh họa cho ý tôi về thứ tự các hàng tồn tại trong bộ nhớ, so với thứ tự chúng được tạo:

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 |
+----+---------+

Vì vậy, bây giờ chúng ta có sáu hàng. Bộ nhớ tại thời điểm này chứa khoảng trống giữa hàng 3 và hàng 8, còn lại sau khi xóa các hàng ở giữa. Việc xóa các hàng không làm phân mảnh những khoảng trống này.

-- 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 |
+----+---------+

Lưu ý cách MySQL đã sử dụng lại các khoảng trống được mở bằng cách xóa các hàng, trước khi nối các hàng mới vào cuối bảng. Cũng lưu ý rằng các hàng từ 11 đến 14 đã được chèn vào các khoảng trống này theo thứ tự ngược lại, điền từ cuối trở lại.

Do đó, thứ tự các hàng được lưu trữ không chính xác là thứ tự mà chúng được chèn vào.

CẬP NHẬT:Cuộc biểu tình này tôi đã viết vào năm 2009 là cho MyISAM. InnoDB trả về các hàng theo thứ tự chỉ mục trừ khi bạn sử dụng ORDER BY. Đây là bằng chứng thêm về điểm ở đầu câu trả lời rằng thứ tự mặc định phụ thuộc vào việc triển khai. Sử dụng một công cụ lưu trữ khác có nghĩa là một cách triển khai khác.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. My MySQL trigger không hoạt động, cú pháp đơn giản, không phức tạp

  2. create_series () tương đương trong MySQL

  3. PHP &MySQL:mysqli_num_rows () mong muốn tham số 1 là mysqli_result, boolean đã cho

  4. Xuất MySQL vào outfile:Các ký tự thoát CSV

  5. Cách sử dụng các chỉ mục để cải thiện hiệu suất truy vấn MySQL