Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Qual é a ordem das linhas do MySQL para SELECT * FROM table_name;?


Não, não há garantias. A menos que você especifique um pedido usando um ORDER BY cláusula, a ordem é totalmente dependente de detalhes de implementação interna. Ou seja o que for mais conveniente para o mecanismo RDBMS.

Na prática, as linhas podem ser retornado em sua ordem de inserção original (ou mais precisamente na ordem em que as linhas existem no armazenamento físico), mas você não deve depender disso. Se você portar seu aplicativo para outra marca de RDBMS, ou mesmo se atualizar para uma versão mais recente do MySQL que possa implementar o armazenamento de maneira diferente, as linhas poderão voltar em outra ordem.

O último ponto é verdadeiro para qualquer RDBMS compatível com SQL.

Aqui está uma demonstração do que quero dizer com a ordem em que as linhas existem no armazenamento versus a ordem em que foram criadas:
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 |
+----+---------+

Então agora temos seis linhas. O armazenamento neste ponto contém uma lacuna entre as linhas 3 e 8, deixada após a exclusão das linhas do meio. A exclusão de linhas não desfragmenta essas lacunas.
-- 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 |
+----+---------+

Observe como o MySQL reutilizou os espaços abertos excluindo linhas, antes de acrescentar novas linhas ao final da tabela. Observe também que as linhas de 11 a 14 foram inseridas nesses espaços em ordem inversa, preenchendo do final para trás.

Portanto, a ordem em que as linhas são armazenadas não é exatamente a ordem em que foram inseridas.

ATUALIZAÇÃO:Esta demonstração que escrevi em 2009 foi para o MyISAM. InnoDB retorna linhas em ordem de índice, a menos que você use ORDER BY. Isso é mais uma evidência do ponto no início da resposta de que a ordem padrão depende da implementação. Usar um mecanismo de armazenamento diferente significa uma implementação diferente.