Especificação MySQL e otimização de desempenho

1. Depois de escrever SQL, primeiro explique para visualizar o plano de execução (otimização de desempenho de SQL)

Ao desenvolver e escrever SQL diariamente, tente desenvolver este bom hábito: Depois de escrever SQL, use explain para analisá-lo e preste atenção especial ao uso do índice.

2. Operar a instrução de exclusão ou atualização e adicionar um limite (remédio para arrependimento SQL)

  • "Reduza o custo de SQL escrito incorretamente" . Ao executar este SQL na linha de comando, se você não adicionar limite, você receberá um "aperto de mão acidental" durante a execução e todos os dados podem ser excluídos. E se você "excluir errado" ? Com o limite 200 adicionado, é diferente. A exclusão do erro é apenas a perda de 200 dados, que podem ser rapidamente recuperados através do log binlog.

  • "A eficiência do SQL provavelmente será maior" , você adiciona o limite 1 à linha do SQL, se o primeiro atingir o retorno de destino, se não houver limite, a tabela de varredura continuará a ser executada.

  • "Evite transações longas" . Quando a exclusão é executada, se a idade adicionar um índice, o MySQL adicionará bloqueios de gravação e bloqueios de lacunas em todas as linhas relacionadas, e todas as linhas relacionadas à execução serão bloqueadas. Se o número de exclusões for grande, afetará diretamente os negócios relacionados. Não disponível.

  • “Se a quantidade de dados for grande, é fácil  encher a CPU.” Se você excluir uma grande quantidade de dados, não limite o número de registros, é fácil preencher a CPU, resultando em uma exclusão mais lenta.

3. Ao projetar uma tabela, adicione comentários correspondentes a todas as tabelas e campos (a especificação SQL é elegante)

Este bom hábito deve ser desenvolvido: ao projetar tabelas de banco de dados, todas as tabelas e campos são adicionados com os comentários correspondentes, que são mais fáceis de manter depois.

"Contra-medida:"

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `balance` int(11) DEFAULT NULL,
  `create_time` datetime NOT NULL ,
  `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8;

"Exemplo:"

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
  `name` varchar(255) DEFAULT NULL COMMENT '账户名',
  `balance` int(11) DEFAULT NULL COMMENT '余额',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';

4. Formato de escrita SQL, mantenha o tamanho da palavra-chave consistente e use recuo. (A especificação SQL é elegante)

"Contra-medida:"

SELECT stu.name, sum(stu.score) from Student stu WHERE stu.classNo = '1班' group by stu.name.

"Exemplo:"

SELECT stu.name, sum(stu.score)
FROM Student stu
WHERE stu.classNo = '1班'
GROUP BY stu.name

5. A instrução INSERT indica o nome do campo correspondente (especificação SQL elegante)

"Contra-medida:"

insert into Student values ('666','捡田螺的小男孩','100');

"Exemplo:"

insert into Student(student_id,name,score) values ('666','捡田螺的小男孩','100');

 6. A operação SQL alterada é executada primeiro no ambiente de teste e as etapas detalhadas da operação e o plano de reversão são gravados e revisados ​​antes da produção. (Remédio de arrependimento SQL)

  • A operação SQL alterada é testada primeiro no ambiente de teste para evitar erros de sintaxe e colocá-la em produção.

  • Para alterar a operação Sql, você precisa especificar as etapas de operação detalhadas, especialmente quando houver dependências, como: modificar a estrutura da tabela primeiro e, em seguida, adicionar os dados correspondentes.

  • Há um plano de reversão para alterar as operações SQL e, antes da produção, revise a alteração SQL correspondente.

7. Ao projetar a tabela do banco de dados, adicione três campos: chave primária, create_time, update_time. (A especificação SQL é elegante)

"Contra-medida:"

CREATE TABLE `account` (
  `name` varchar(255) DEFAULT NULL COMMENT '账户名',
  `balance` int(11) DEFAULT NULL COMMENT '余额',
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';

"Exemplo:"

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',
  `name` varchar(255) DEFAULT NULL COMMENT '账户名',
  `balance` int(11) DEFAULT NULL COMMENT '余额',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';

"Razão:"

  • A chave primária é geralmente adicionada, a tabela sem uma chave primária não tem alma

  • Recomenda-se adicionar a hora de criação e a hora de atualização. Os registros detalhados de auditoria e rastreamento são úteis.

O manual de desenvolvimento de Ali também menciona esse ponto, conforme mostrado na figura

8. Depois de escrever a instrução SQL, verifique as colunas atrás de onde, ordenar por, agrupar por e se as colunas associadas a várias tabelas foram indexadas e se o índice combinado é preferido. (Otimização de desempenho SQL)

 "Contra-medida:"

select * from user 
where address ='深圳' order by age;

"Exemplo:"

添加索引
alter table user add index idx_address_age (address,age)

 

9. Antes de modificar ou excluir dados importantes, faça backup, faça backup primeiro, faça backup primeiro (remédio para arrependimento SQL)

Se você deseja modificar ou excluir dados, você deve fazer backup dos dados a serem modificados antes de executar o SQL. Em caso de operação incorreta, você ainda pode dar uma mordida no "remédio do arrependimento" ~

10. O campo atrás de onde, preste atenção à conversão implícita de seu tipo de dados (otimização de desempenho de SQL)

"Contra-medida:"

//userid 是varchar字符串类型
select * from user where userid =123;

"Exemplo:" 

select * from user where userid ='123';

"Razão:"

Porque quando as aspas simples não são adicionadas, é uma comparação entre uma string e um número, e seus tipos não correspondem. O MySQL fará a conversão implícita de tipo, convertê-los em números de ponto flutuante e então compará-los, e finalmente causar a falha do índice

11. Tente definir todas as colunas como NOT NULL (a especificação SQL é elegante)

  • "A coluna NOT NULL economiza mais espaço." A coluna NULL precisa de um byte extra como sinalizador para determinar se é NULL.

  • "Colunas NULL precisam prestar atenção ao problema de ponteiros nulos" . Ao calcular e comparar colunas NULL, você precisa prestar atenção ao problema de ponteiros nulos.

12. Para modificar ou excluir o SQL, escreva WHERE para verificar primeiro e, em seguida, adicione excluir ou atualizar após a confirmação (remédio para arrependimento do SQL)

Especialmente ao operar os dados produzidos, se você encontrar SQL modificado ou excluído, primeiro adicione uma consulta where, confirme OK e, em seguida, execute a operação de atualização ou exclusão

13. Reduza o retorno de campo desnecessário, como usar select <campo específico> em vez de select * (otimização de desempenho de SQL)

"Contra-medida:"

select * from employee;

"Exemplo:"

select id,name from employee;

Razão:

  • Economize recursos e reduza a sobrecarga da rede.

  • Os índices de cobertura podem ser usados ​​para reduzir tabelas anteriores e melhorar a eficiência da consulta.

14. Todas as tabelas devem usar o mecanismo de armazenamento Innodb (especificação SQL elegante)

Innodb  "oferece suporte a transações, bloqueios de nível de linha e melhor capacidade de recuperação." Ele tem melhor desempenho sob alta simultaneidade, portanto, não há requisitos especiais (ou seja, funções que o Innodb não pode atender, como armazenamento de coluna, armazenamento de dados de espaço, etc.) , Todas as tabelas devem usar o mecanismo de armazenamento Innodb

15. Tente usar UTF8 uniformemente para os conjuntos de caracteres de bancos de dados e tabelas (a especificação SQL é elegante)

Tente usar a codificação UTF8 uniformemente

  • Pode evitar o problema confuso

  • Pode evitar o problema de invalidação de índice causado pela comparação e conversão de diferentes conjuntos de caracteres

"Se você precisar armazenar emoticons, escolha utf8mb4 para armazenar, preste atenção na diferença entre ele e a codificação utf-8."

begin;
update account set balance =1000000
where name ='捡田螺的小男孩';
commit;

16. Tente usar varchar em vez de char. (Otimização de desempenho SQL)

"Contra-medida:"

 `deptName` char(100) DEFAULT NULL COMMENT '部门名称'

"Exemplo:"

`deptName` varchar(100) DEFAULT NULL COMMENT '部门名称'

Razão:

  • Como o espaço de armazenamento de campos de comprimento variável é pequeno, o espaço de armazenamento pode ser economizado.

17. Se você modificar o significado de um campo ou adicionar ao estado do campo, será necessário atualizar o comentário do campo a tempo. (A especificação SQL é elegante)

Este ponto é o protocolo Mysql no manual de desenvolvimento de Ali. O seu campo, especialmente quando representa o estado de enumeração, se o significado for modificado ou quando o estado for adicionado, para melhor manutenção posterior, você precisa atualizar os comentários do campo imediatamente.

18. Linha de comando SQL para modificar dados, desenvolver o hábito de iniciar + confirmar transação (remédio para arrependimento SQL)

"Contra-medida:"

update account set balance =1000000
where name ='捡田螺的小男孩';

"Exemplo:"

begin;
update account set balance =1000000
where name ='捡田螺的小男孩';
commit;

19. A nomenclatura do índice deve ser padronizada, o índice da chave primária é denominado pk_ nome do campo; o índice exclusivo é denominado uk _ nome do campo; o nome do índice comum é idx _ nome do campo. (A especificação SQL é elegante)

Descrição: pk_ é a chave primária; uk_ é a chave única; idx_ é a abreviatura do índice.

20. A conversão de função e o cálculo de expressão não são realizados em colunas na cláusula WHERE

Supondo que loginTime esteja indexado

"Contra-medida:"

select userId,loginTime 
from loginuser
where Date_ADD(loginTime,Interval 7 DAY) >=now();

"Exemplo:"

explain  select userId,loginTime 
from loginuser 
where  loginTime >= Date_ADD(NOW(),INTERVAL - 7 DAY);

"Razão:"

Use a função integrada do MySQL na coluna do índice, o índice é inválido

21. Se você modificar / atualizar muitos dados, considere o envio em lote.

"Contra-medida:"

delete from account  limit 100000;

"Exemplo:"

for each(200次)
{
 delete from account  limit 500;
}

"Razão:"

  • Grandes operações em lote causarão atrasos mestre-escravo.

  • As operações em grande escala irão gerar grandes transações e bloquear.

  • Operações em grande escala e muitos dados encherão a CPU.

 

Anterior: Otimização de desempenho de acesso ao banco de dados Oracle

Próximo: backup e recuperação de banco de dados PostgreSQL

 

Reimpresso: https://blog.csdn.net/weiwenhou/article/details/109505984

 

Acho que você gosta

Origin blog.csdn.net/guorui_java/article/details/111302048
Recomendado
Clasificación