Mysql
 sql >> база данни >  >> RDS >> Mysql

Какъв е редът на редовете в MySQL за SELECT * FROM table_name;?

Не, няма гаранции. Освен ако не посочите поръчка с ORDER BY клауза, поръчката зависи изцяло от вътрешните детайли за изпълнение. т.е. каквото е най-удобно за RDBMS двигателя.

На практика редовете могат да да бъдат върнати в оригиналния им ред на вмъкване (или по-точно реда, в който редовете съществуват във физическото хранилище), но не трябва да разчитате на това. Ако пренесете приложението си към друга марка RDBMS или дори ако надстроите до по-нова версия на MySQL, която може да реализира съхранението по различен начин, редовете може да се върнат в друг ред.

Последната точка е вярна за всяка SQL-съвместима RDBMS.

Ето демонстрация на това какво имам предвид под реда, в който редовете съществуват в хранилището, спрямо реда, в който са създадени:

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

Така че сега имаме шест реда. Съхранението в този момент съдържа празнина между редове 3 и 8, останала след изтриване на средните редове. Изтриването на редове не дефрагментира тези пропуски.

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

Забележете как MySQL е използвал повторно пространствата, отворени чрез изтриване на редове, преди да добави нови редове в края на таблицата. Също така забележете, че редове от 11 до 14 бяха вмъкнати в тези интервали в обратен ред, запълвайки от края назад.

Следователно редът, в който се съхраняват редовете, не е точно този, в който са били вмъкнати.

АКТУАЛИЗАЦИЯ:Тази демонстрация, която написах през 2009 г., беше за MyISAM. InnoDB връща редове в индексен ред, освен ако не използвате 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. Как да разположите Chamilo MySQL база данни за висока наличност

  2. Как да се свържа с MySQL на Amazon EC2 от Linux / Mac?

  3. Как да коригирам често срещани проблеми с MySQL база данни?

  4. Внедряване в няколко облака за MySQL репликация

  5. Най-добрият начин да ВМЕСИТЕ много стойности в mysqli?