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

Как данните се подреждат в MySql по подразбиране

В InnoDB , редовете се съхраняват в ред на първичен ключ. Ако използвате LIMIT без ORDER BY , винаги ще получавате редовете с най-ниските стойности на първичен ключ, дори ако сте ги вмъкнали в произволен ред.

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

В MyISAM , редовете се съхраняват навсякъде, където се поберат. Първоначално това означава, че редовете се добавят към файла с данни, но докато изтривате редове и вмъквате нови, празнините, оставени от изтритите редове, ще бъдат използвани повторно от нови редове.

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

Друг случай на изключение, ако използвате InnoDB, е ако извличате редове от вторичен индекс вместо от първичния индекс. Това се случва, когато видите бележката „Използване на индекс“ в изхода EXPLAIN.

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

Ако имате по-сложни заявки с обединения, става още по-сложно, защото ще получите редовете, върнати по реда по подразбиране на първата достъпна таблица (където "първо" зависи от оптимизатора, който избере реда на таблиците), след това редовете от обединената таблица ще зависят от реда на редовете от предишната таблица.

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

Основното е, че е най-добре да бъдете изрични:когато използвате LIMIT , посочете 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. MySql Модифицирано дърво за предварителна поръчка за създаване на URL адрес

  2. Използвайте ключова дума SQL като псевдоним на колона

  3. Съвпадение на MySQL срещу - В БУЛЕВ РЕЖИМ?

  4. Преобразувайте JS date time в MySQL datetime

  5. Linux shell скрипт за архивиране на база данни