AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 97470
Accepted
Pacerier
Pacerier
Asked: 2015-04-10 12:55:50 +0800 CST2015-04-10 12:55:50 +0800 CST 2015-04-10 12:55:50 +0800 CST

Será que "obsoleto" no MySQL significa "não garantido" ou "ainda garantido"?

  • 772
Bloqueado . Os comentários sobre esta pergunta foram desativados, mas ainda estão aceitando novas respostas e outras interações. Saiba mais .

MySQL 3.23/4.0/4.1 e 5.1 afirma:

Se você usar GROUP BY [ for select] , as linhas de saída serão classificadas de acordo com as GROUP BYcolunas, como se você tivesse um ORDER BYpara as mesmas colunas. ➫➫➫

No entanto, o MySQL 5.5 afirma:

Confiar na classificação implícita GROUP BYno MySQL 5.5 está obsoleto . Para obter uma ordem de classificação específica de resultados agrupados, é preferível usar uma ORDER BYcláusula explícita. ➫➫➫

(A informação acima também é declarada em 5.6 e 5.7 .)

O que exatamente significa "obsoleto" no MySQL?

O comportamento implícito group byainda é garantido para funcionar no MySQL 5.5, 5.6 e 5.7 (a versão atual mais recente), assim como em todas as versões anteriores?

ORDER BY NULLAinda é necessário impedir que o MySQL faça uma classificação desnecessária?

Editar (por Rick James)

Isso cobre problemas de banco de dados:

  • A ordenação de um GROUP BYsemORDER BY
  • O significado e a utilidade deORDER BY NULL
  • A sabedoria de usar um 'recurso' 'obsoleto'
  • O significado de "obsoleto" no manual do MySQL (não apenas para este caso)
mysql
  • 3 3 respostas
  • 1318 Views

3 respostas

  • Voted
  1. Best Answer
    Rick James
    2015-04-10T13:40:10+08:002015-04-10T13:40:10+08:00

    "Descontinuado" significa "não use; será removido/proibido/errôneo/quebrado/etc é uma versão futura". Enquanto isso, funciona .

    Esta é uma maneira lenta e tediosa para o MySQL mudar algo que irá quebrar muitos programas. Ninguém sabe quantas pessoas dependem de GROUP BYum arquivo ORDER BY . Esse "recurso" específico era uma extensão do padrão Ansi. Eu suspeito que eles gostariam de mudar o MySQL por dois motivos:

    • Cumprir o padrão
    • Permitir certas otimizações (veja abaixo)

    A maneira simples (pense na versão 3.xx) de fazer GROUP BYé classificar as linhas e percorrê-las, reunindo dups e fazendo SUM()etc. E, na época das máquinas de núcleo único, isso era bastante razoável. E o resultado seria classificado naturalmente. Mas... Se você quiser lançar um GROUP BYem uma máquina de 24 núcleos, fica muito complicado manter a classificação. Então (estou supondo), essa é uma otimização que chegará ao mesmo tempo que GROUP BYnão faz mais um arquivo ORDER BY. Isso pode acontecer em 5.8 (apenas um palpite).

    Você ainda pode obter o efeito, mas precisa dizer explicitamente ORDER BYcom a mesma lista de colunas/expressões.

    O ORDER BY NULL(atualmente) não faz nada na maioria dos casos, já que a maioria dos casos considera mais eficiente classificar os arquivos GROUP BY. ORDER BY NULL, no futuro provavelmente será permitido, mas efetivamente será um no-op; afinal, levará ao mesmo resultado.

    Outras coisas obsoletas têm lógica semelhante. CREATE TABLE (...) TYPE=MyISAMeventualmente (após um período de depreciação) tornou-se CREATE TABLE (...) ENGINE=MyISAM. Isso quebrou algumas situações de exportação/importação, mas apenas se você estivesse passando de uma versão realmente antiga para uma nova. SHOW INNODB STATUStornou -se SHOW ENGINE INNODB STATUS, provavelmente para fazer uma análise mais limpa de SHOW.

    • 10
  2. RolandoMySQLDBA
    2015-04-10T13:36:18+08:002015-04-10T13:36:18+08:00

    Desde o MySQL 5.5, GROUP BYfazer o pedido não é mais garantido implicitamente.

    Ainda é ORDER BY NULLnecessário impedir que o MySQL faça uma classificação desnecessária?

    Observe como o MySQL lida NULLcom valores comORDER BY

    Dois valores NULL são considerados iguais em um GROUP BY.

    Ao fazer um ORDER BY, os valores NULL são apresentados primeiro se você fizer ORDER BY ... ASC e por último se você fizer ORDER BY ... DESC

    A mesma coisa se aplica a DISTINCT

    Como ORDER BY NULLé crescente e o valor de order é NULL, a ordem do conjunto de dados antes ORDER BY NULLserá a mesma depois.

    Outro problema externo que pode impor ou negar a ordenação é o InnoDB Storage Engine. Eu tenho um post antigo sobre como o índice clusterizado às vezes pode atrapalhar a tabela em uma ordem de índice físico desejada: MySQL InnoDB Sorting Issue . Aqui está uma postagem ainda melhor (Qual é a ordem padrão dos registros para uma instrução SELECT no MySQL?) de Laurynas Biveinis sobre como o mecanismo de armazenamento afeta a ordem.

    Os desenvolvedores contam com a ordem implícita há anos. O tapete pode ser facilmente puxado sob você caso você decida atualizar o MySQL a cada versão menor.

    Para ilustrar isso, veja a opção simplificada_binlog_gtid_recovery . Foi introduzido no MySQL 5.6.21 para ajudar o mysqld a atravessar binlogs para GTID e recuperação de falhas. Adivinha ??? Duas versões menores depois (MySQL 5.6.23), a Oracle introduziu o binlog_gtid_simple_recovery . Você não sabe quando a Oracle retirará o tapete e retirará o uso de simplificado_binlog_gtid_recovery . Muitas infraestruturas contando com essa velha opção. Portanto, COMPRADOR CUIDADO!!!

    Claro, esta é uma nova opção que foi rapidamente substituída por um novo nome.

    Agora, imagine quantos aplicativos foram escritos que dependem da classificação implícita e são afetados por uma atualização do mysql.

    Portanto, você sempre deve testar o código no servidor Dev/Staging para quaisquer alterações comportamentais em SELECTs. Não há substituto para tais testes.

    • 6
  3. Matthew Steeples
    2015-04-10T13:27:31+08:002015-04-10T13:27:31+08:00

    Isso significa que as versões mais antigas do MySQL costumavam ter uma classificação padrão implicitamente na mesma coluna como "agrupar por" e é esse comportamento que está obsoleto. Tudo o que você especificar na cláusula group by se comportará da mesma forma que anteriormente e com certeza funcionará, apenas a ordem pode ser diferente.

    A última parte da sua pergunta (ORDER BY NULL) não é mais necessária, pois a classificação padrão desnecessária agora ocorre mais (já que foi obsoleta)

    • 3

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve