sql >> Database >  >> RDS >> Mysql

Hoe gegevens standaard in MySql worden geordend

In InnoDB , worden rijen opgeslagen in de volgorde van de primaire sleutel. Als u LIMIT . gebruikt zonder ORDER BY , krijgt u altijd de rijen met de laagste primaire sleutelwaarden, zelfs als u ze in willekeurige volgorde hebt ingevoegd.

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

In MijnISAM , worden rijen opgeslagen waar ze passen. In eerste instantie betekent dit dat rijen aan het gegevensbestand worden toegevoegd, maar als u rijen verwijdert en nieuwe invoegt, worden de gaten die zijn achtergelaten door verwijderde rijen opnieuw gebruikt door nieuwe rijen.

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

Een ander uitzonderingsgeval als u InnoDB gebruikt, is als u rijen ophaalt uit een secundaire index in plaats van uit de primaire index. Dit gebeurt wanneer u de opmerking "Using index" ziet in de EXPLAIN-uitvoer.

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

Als u complexere query's heeft met joins, wordt het nog ingewikkelder, omdat u de rijen terugkrijgt in de standaardvolgorde van de eerste geopende tabel (waarbij "eerste" afhankelijk is van het optimaliseren van de volgorde van tabellen), dan rijen uit de samengevoegde tabel zijn afhankelijk van de volgorde van de rijen uit de vorige tabel.

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

Het komt erop neer dat u het beste expliciet kunt zijn:wanneer u LIMIT gebruikt , specificeer een ORDER BY .



  1. Verbinding maken met OpenShift (Redhat Paas) mysql-instantie

  2. Hoe u Change Data Capture (CDC) op een database in SQL Server inschakelt - SQL Server-zelfstudie

  3. Bewaar meerdere e-mailadressen in de database voor verschillende gebruikerstypes

  4. Krijg de naam van de weekdag van het indexnummer in MYSQL