Artigos_visualização avançada do banco de dados MySQL, transação, índice

Banco de dados MySQL avançado

visualizar

Para instruções SQL de consulta complexas, elas geralmente são obtidas por várias tabelas para consultas relacionadas. Se o banco de dados for alterado devido a requisitos e outros motivos, a fim de garantir que os dados consultados sejam os mesmos de antes, eles precisam ser modificados em vários lugares, e a manutenção é muito problemática, desta vez podemos 定义视图resolver.

O que é uma vista?

通俗一点来说,'视图' 其实就是一个 'SELECT' 语句的结果集。Então, quando estávamos lá 使用视图, a principal tarefa era criar essa consulta SQL.

视图的本质是对若干个基本表/引用表的引用,一张虚表(也可以理解为假的表),查询语句执行的结果, Na verdade, os dados reais não são armazenados (quando os dados da tabela básica / tabela de referência mudam, o resultado da execução da consulta da visualização também muda).

视图A vantagem é que as operações de consulta reduzem as instruções SQL complexas e aumentam a legibilidade.

Defina a vista

  • Recomenda-se que o nome da visualização comece com 'v_'
create view 视图名称 as select语句;

Ver tentativa

  • A tabela de visualização também irá listar todas as visualizações
show tables;

Use a vista

  • O objetivo da visualização é consultar
select * from v_stu_score;

Apagar vista

  • drop view view name;
drop view v_stu_sco;

Ver demonstração

view01

view02

view03

view04

O papel da visão

  • Reutilização aprimorada, assim como uma função
  • Refatore o banco de dados sem afetar a operação do programa
  • Desempenho de segurança aprimorado, pode ser usado para diferentes usuários
  • Torne os dados mais claros

一般大公司有自己的数据库设计规范,比如禁止使用视图之类的情况。

romances

O que é uma transação?

A transação é amplamente utilizada em uma variedade de cenários, como sistema de pedidos, sistema bancário, etc.

例如:

	A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事:

		1、检查A的账户余额>500元;
		2、A 账户中扣除500元;
		3、B 账户中增加500元;

O processo normal foi interrompido, a conta A deduziu 500, a conta B adicionou 500, todos estão felizes.

E se o sistema falhar após o dinheiro ser deduzido da conta A? A perdeu 500 em vão e B não recebeu os 500 que deveriam ter pertencido a ele.

No caso acima, um pré-requisito está oculto: A deduz dinheiro e B aumenta o dinheiro, ou obtém sucesso ao mesmo tempo ou falha ao mesmo tempo. Esta é a necessidade de transações

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

Por exemplo, trabalho de transferência bancária: deduzindo dinheiro de uma conta e adicionando dinheiro a outra conta, essas duas operações são realizadas ou não realizadas. Portanto, eles devem ser considerados como uma questão. Uma transação é uma unidade do banco de dados para manter a consistência dos dados.Ao final de cada transação, a consistência dos dados pode ser mantida.

Quatro características de transação (ACID para breve)

  • Atomicidade
  • Consistência
  • Isolamento
  • Durabilidade

O conteúdo a seguir é da terceira edição do "MySQL de alto desempenho". Compreender o ACID das transações e os quatro níveis de isolamento nos ajuda a entender melhor as operações das transações.

A seguir está um exemplo clássico de um aplicativo bancário que explica a necessidade de transações. Suponha que o banco de dados de um banco tenha duas tabelas: verificação e poupança. Agora, para transferir $ 200 da conta corrente da usuária Jane para sua conta poupança, são necessárias pelo menos três etapas:

Verifique se o saldo da conta corrente é maior ou igual a $ 200.
Subtraia $ 200 do saldo da conta corrente.
Adicione 200 dólares ao saldo da conta poupança.

上述三个步骤的操作必须打包在一个事务中,任何一个步骤失败,则必须回滚所有的步骤。

Você pode iniciar uma transação com a instrução START TRANSACTION e, em seguida, usar COMMIT para confirmar os dados modificados para persistir ou usar ROLLBACK para desfazer todas as modificações. O exemplo de transação SQL é o seguinte:

1、start transaction;
2、select balance from checking where customer_id = 10233276;
3、update checking set balance = balance - 200.00 where customer_id = 10233276;
4、update savings set balance = balance + 200.00 where customer_id = 10233276;
5、commit;

Um bom sistema de processamento de transações deve ter esses recursos padrão

  • Atomicidade

Uma transação deve ser considerada como uma unidade mínima de trabalho indivisível. Todas as operações em toda a transação são enviadas com sucesso ou todas falharam e foram revertidas. Para uma transação, é impossível realizar apenas parte das operações. Esta é a Atomicidade da transação

  • Consistência

O banco de dados sempre faz a transição de um estado consistente para outro. (No exemplo anterior, a consistência é garantida. Mesmo se o sistema travar entre a execução da terceira e da quarta declarações, não haverá perda de $ 200 na conta corrente, porque a transação não foi finalmente confirmada, então as alterações feitas em a transação também não será salva no banco de dados.)

  • Isolamento

De modo geral, as alterações feitas por uma empresa não são visíveis para outras transações até que sejam finalmente submetidas. (No exemplo anterior, quando o terceiro extrato é executado e o quarto ainda não foi iniciado, outro programa de resumo da conta está em execução neste momento e vê que o saldo da conta corrente não foi subtraído de 200 dólares americanos. )

  • Durabilidade

Assim que a transação for confirmada, as alterações feitas serão salvas permanentemente no banco de dados. (Neste momento, mesmo se o sistema travar, os dados modificados não serão perdidos.)

Ordem de transação

  • O tipo de mecanismo da tabela deve ser do tipo innodb para usar transações, que é o mecanismo padrão para tabelas mysql.

Veja a declaração de criação da tabela, você pode ver engine = innodb

-- 选择数据库
use jing_dong;
-- 查看goods表
show create table goods;

Para abrir a transação, o comando é o seguinte:

  • Execute o comando de modificação após abrir a transação, as alterações serão mantidas no cache local, mas não na tabela física
begin;
或者
start transaction;

Confirme a transação, o comando é o seguinte

  • Manter as mudanças de dados no cache para a tabela física
commit;

Para reverter a transação, o comando é o seguinte:

  • Descartar os dados alterados no cache
rollback;

Nota

  • O comando para modificar os dados acionará automaticamente a transação, incluindo inserir, atualizar, excluir
  • O motivo para abrir manualmente a transação na instrução SQL é: você pode modificar os dados várias vezes; se for bem-sucedido juntos, ele rolará para os dados anteriores juntos.

índice

A proporção de leitura e gravação do sistema de aplicativo geral para o banco de dados é de cerca de 10: 1 (ou seja, há 1 operação de gravação quando há 10 operações de consulta), e as operações de inserção e atualização raramente têm problemas de desempenho e encontram a maioria O problema ainda são algumas operações de consulta complexas, portanto, a otimização da instrução de consulta é obviamente a prioridade principal.

Quando a quantidade de dados no banco de dados é muito grande, ficará muito lento para localizar os dados, desta vez eles serão usados优化解决方案:索引。

O que é um índice?

Os índices são um tipo especial de arquivo (o índice na tabela de dados InnoDB é uma parte integrante do espaço da tabela), eles contêm ponteiros de referência para todos os registros na tabela de dados.

Em termos mais gerais, o índice do banco de dados é como um índice na frente de um livro, o que pode acelerar a velocidade de consulta do banco de dados.

O objetivo do índice

O objetivo da indexação é melhorar a eficiência da consulta. Ela pode ser comparada a um dicionário. Se quisermos pesquisar a palavra "mysql", devemos localizar a letra m, encontrar a letra y na parte inferior e, em seguida, localizar o resto do sql. Se não houver índice, talvez você precise examinar todas as palavras para encontrar o que deseja. E se eu quiser encontrar a palavra que começa com m? Ou as palavras que começam com ze? Você acha que isso não pode ser feito sem indexação?

Princípio de Índice

Além dos dicionários, exemplos de índices podem ser encontrados em todos os lugares da vida, como horários de trens em estações de trem e catálogos de livros. O princípio deles é o mesmo: ao estreitar constantemente a gama de dados que deseja obter, você pode filtrar o resultado final desejado, enquanto transforma eventos aleatórios em eventos sequenciais, ou seja, sempre usamos o mesmo método de pesquisa para bloquear os dados.

O banco de dados é o mesmo, mas é obviamente muito mais complicado, porque não só se depara com consultas equivalentes, mas também consultas de intervalo (>, <, entre, em), consultas difusas (como), consultas de união (ou), e assim por diante. Que maneira o banco de dados deve escolher para lidar com todos os problemas? Vamos pensar no exemplo do dicionário. Podemos dividir os dados em segmentos e depois consultá-los em segmentos? O mais simples é se 1000 pedaços de dados, 1 a 100 são divididos no primeiro parágrafo, 101 a 200 são divididos no segundo parágrafo e 201 a 300 são divididos no terceiro parágrafo ... Desta forma, para verificar o 250º dado, você só precisa encontrar o terceiro parágrafo. Removidos 90% dos dados inválidos.

suoyin01

Uso de índice

  • Exibir índice
show index from 表名;
  • Criar índice
    • Se o campo especificado for uma string, o comprimento precisa ser especificado e é recomendado que o comprimento seja igual ao comprimento quando o campo foi definido
    • Se o tipo de campo não for uma string, você não precisa preencher a parte do comprimento
create index 索引名称 on 表名(字段名称(长度))
  • Apagar índice
drop index 索引名称 on 表名;

Demonstração do índice

Criar tabela de teste testindex

create table test_index(title varchar(10));

Use o programa python (ipython também é possível) para adicionar cem mil pedaços de dados à tabela através do módulo pymsql

from pymysql import connect

def main():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')
    # 获得Cursor对象
    cursor = conn.cursor()
    # 插入10万次数据
    for i in range(100000):
        cursor.execute("insert into test_index values('ha-%d')" % i)
    # 提交数据
    conn.commit()

if __name__ == "__main__":
    main()

Investigar

  • Ative o monitoramento do tempo de execução:
set profiling=1;
  • Encontre os 10.000 dados ha-99999
select * from test_index where title='ha-99999';
  • Veja o tempo de execução:
show profiles;
  • Crie um índice para a coluna de título da tabela title_index:
create index title_index on test_index(title(10));
  • Execute a instrução de consulta:
select * from test_index where title='ha-99999';
  • Verifique o tempo de execução novamente
show profiles;

Nota:

要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个
经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,
排序的开销不会很大,也没有必要建立另外的索引。

建立索引会占用磁盘空间

Acho que você gosta

Origin blog.csdn.net/weixin_42250835/article/details/90694483
Recomendado
Clasificación