sql >> Database teknologi >  >> RDS >> Mysql

Sådan bestilles data i MySql som standard

I InnoDB , rækker gemmes i primær nøglerækkefølge. Hvis du bruger LIMIT uden ORDER BY , vil du altid få rækkerne med de laveste primærnøgleværdier, også selvom du har indsat dem i tilfældig rækkefølge.

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

I MyISAM , rækker gemmes, hvor end de passer. I første omgang betyder det, at rækker føjes til datafilen, men efterhånden som du sletter rækker og indsætter nye, vil hullerne efter slettede rækker blive genbrugt af nye rækker.

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

Et andet undtagelsestilfælde, hvis du bruger InnoDB, er, hvis du henter rækker fra et sekundært indeks i stedet for fra det primære indeks. Dette sker, når du ser noten "Using index" i EXPLAIN-outputtet.

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

Hvis du har mere komplekse forespørgsler med joinforbindelser, bliver det endnu mere kompliceret, fordi du vil få rækkerne returneret efter standardrækkefølgen for den første tabel, der tilgås (hvor "først" er afhængig af, at optimeringsværktøjet vælger rækkefølgen af ​​tabeller), så rækker fra den sammenføjede tabel vil være afhængig af rækkefølgen af ​​rækker fra den foregående 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 |
+----+------+------+----+------+------+

Den nederste linje er, at det er bedst at være eksplicit:når du bruger LIMIT , angiv en ORDER BY .



  1. Materialiserede visninger med MySQL

  2. Kan du lide Operator in Entity Framework?

  3. Gå i dvale for at fortsætte Datoer så længe

  4. Kan ikke importere mysql-python i crontab Mac OS