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

Desempenho do MySQL:índices MySQL/MariaDB


Os dados em um banco de dados MySQL/MariaDB são armazenados em tabelas. Uma maneira simples de pensar sobre índices é imaginar uma planilha extensa. Esse tipo de sistema nem sempre é propício para buscas rápidas; é aí que um índice se torna essencial. Se não houver índice, o mecanismo de banco de dados deve iniciar na linha um e navegar por todas as linhas procurando os valores correspondentes. Se esta for uma tabela pequena, não é grande coisa, mas em tabelas e aplicativos maiores, onde pode haver tabelas com milhões e até bilhões de linhas, torna-se problemático. Como você pode imaginar, pesquisar essas linhas uma a uma consumirá muito tempo, mesmo no hardware mais recente. A solução é criar um INDEX (ou mais de um) para seus dados.

O que é um índice?


Um índice é uma tabela de pesquisa organizada que contém ponteiros para onde os dados podem ser recuperados no banco de dados. Este conceito é semelhante aos índices de livros. Em um livro, o índice lista os números das páginas onde vários tópicos estão localizados. Em um banco de dados, o índice armazena ponteiros que estão em uma ordem lógica e classificada, permitindo pesquisas rápidas no banco de dados. Imagine um livro sem índice. Se você deseja pesquisar informações sobre um tópico específico, deve começar do início e folhear as páginas até encontrar a informação que está procurando. Um índice de livros resolve isso dizendo exatamente em quais páginas estão as informações que você está procurando. É basicamente assim que um índice MySQL funciona.

Quando o MySQL usa índices?


Sempre que o servidor de banco de dados precisar pesquisar informações, ele usará um índice para acelerar o processo. Exemplos disso incluem as cláusulas WHERE, JOIN ON, MIN/MAX e ORDER BY/GROUP BY. Se suas consultas forem pesquisar ou corresponder a uma coluna com frequência em qualquer uma dessas situações, considere a criação de um índice.

Os índices melhoram o desempenho do banco de dados?


Na maioria das vezes, a resposta curta é sim. Para leituras e pesquisas nos dados, os índices aumentam o desempenho absolutamente. Não fazer varreduras de tabela completas melhorará praticamente qualquer consulta SELECT. Isso tem um preço pequeno. Para colunas que são frequentemente manipuladas, há um custo para cada alteração. Isso pode atrapalhar INSERTs e UPDATEs no banco de dados.

Tipos comuns de índice MySQL


Existem três tipos comuns de índices MySQL:
  • Chave primária
  • Índice
  • Único

CHAVE PRIMÁRIA


Uma chave primária informa ao servidor de banco de dados quais são as colunas mais importantes da tabela. Normalmente, isso é usado para colunas de id auto_increment. Por exemplo, se você tiver uma tabela que contenha informações de funcionários, você desejará uma chave primária na coluna “EMPLOYEE_ID”. Em outras tabelas, ou seja, uma tabela de salários, você simplesmente se referiria ao EMPLOYEE_ID em vez de todos os dados do funcionário.

ÍNDICE


Um INDEX padrão é usado para informar ao servidor de banco de dados que uma ou mais colunas da tabela serão muito pesquisadas e, portanto, um índice deve ser criado nelas. Isso pode ser construído durante a criação da tabela ou se você achar que precisa de um índice em uma coluna posteriormente, ele pode ser adicionado então.

ÚNICO


Um índice UNIQUE é um pouco distinto, pois coloca restrições específicas sobre o que pode ser escrito na tabela. Se você tentar inserir uma linha que contenha um valor que já esteja incluído nos dados, o INSERT produzirá um erro. Isso permite pesquisas rápidas, bem como alguma integridade de dados.

Como criar um índice


Existem várias maneiras de criar um índice em uma coluna. Você pode configurar um índice ao CREATE TABLE, ou posteriormente com as instruções ALTER TABLE ou CREATE INDEX.

Criando um índice PRIMARY KEY


A maneira mais fácil de criar um índice PRIMARY KEY é fazê-lo ao criar a tabela. Usaremos um exemplo de uma tabela de funcionários para este tutorial. A tabela terá três colunas:ID, FIRSTNAME e LASTNAME. A criação pode ser algo assim:
CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32)
);

Essa instrução criará a tabela sem um índice. Podemos adicionar a chave primária com uma declaração como esta:
ALTER TABLE EMPLOYEE
  ADD CONSTRAINT PRIMARY KEY (ID);

Isso informa ao MySQL que temos uma chave primária no ID da coluna.

Uma maneira mais direta de fazer isso é durante a criação da tabela. Começando de novo, vamos recriar a tabela e adicionar a chave primária em uma instrução.
CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Essa única instrução executa as mesmas tarefas que as duas primeiras instruções acima. Uma chave primária pode conter mais de uma coluna, mas todas as colunas devem ser exclusivas. A chave primária pode ser usada para identificar qualquer linha individual na tabela.

Criando um índice usando CREATE INDEX


Usando a tabela de exemplo acima, imagine que a empresa tem milhares de funcionários e você deseja pesquisar os funcionários rapidamente pelo sobrenome. Com uma chave primária, só pode haver uma entrada. Você não pode ter várias pessoas com o mesmo ID de funcionário. Com sobrenomes, é bastante comum que várias pessoas compartilhem esse nome. Novamente, existem algumas maneiras de fazer isso. Usando a tabela acima:
CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Podemos adicionar um índice à coluna LASTNAME assim:
CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);

As pesquisas por LASTNAME agora serão mais rápidas nesta tabela. Neste exemplo, “idx1” é o nome do índice. Isso tornará mais fácil fazer referência ao próprio índice no futuro, se necessário.

Outra maneira de adicionar um índice a uma tabela é com o comando ALTER TABLE. Para realizar a mesma coisa que fizemos com a instrução anterior, executaríamos o seguinte comando:
ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);

A maneira final de adicionar um índice que economizaria algum tempo é fazê-lo durante o CREATE TABLE. Se você souber de antemão que estará pesquisando ou participando de uma coluna específica, poderá criar a tabela inicial com o índice já existente:
CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx1 (LASTNAME)
);

Todas essas três declarações criam o mesmo resultado.

Índices de várias colunas


Um índice não precisa estar apenas em uma única coluna. Se quisermos pesquisas mais rápidas em FIRSTNAME e LASTNAME, podemos criar um índice em ambas as colunas. Na tabela create ficaria assim:
CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx2 (LASTNAME,FIRSTNAME)
);

Usando o comando CREATE INDEX:
CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);

E, finalmente, o comando ALTER TABLE:
ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);

Criando um ÍNDICE ÚNICO


Pode haver momentos em que você queira criar um índice em uma coluna e também forçar todas as entradas nessa coluna a serem exclusivas. Se estendermos nossa tabela de exemplo para incluir uma coluna OFFICE (indicando qual escritório no prédio eles têm), talvez queiramos fazer disso um índice UNIQUE. Vamos trabalhar com esta tabela:
CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  OFFICE INT,
  PRIMARY KEY (ID)
);

Observe que agora temos um inteiro armazenado na tabela para indicar qual cargo a pessoa ocupa. Isso pode se referir a outra tabela, “ESCRITÓRIOS”, que conterá informações sobre vários escritórios no prédio.

Para criar um índice sobre isso, emitiríamos o seguinte comando:
CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);

Você pode usar comandos semelhantes para criá-los nos comandos CREATE TABLE e ALTER TABLE. Agora, se você tentou executar essas duas inserções:
INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);

Você receberia um erro no segundo INSERT:
Duplicate entry '1' for key 'idx3'

Removendo um índice


Pode chegar um momento em que você não queira mais um índice em uma coluna. Talvez você tenha percebido que não pesquisa uma coluna com tanta frequência e o índice está diminuindo a velocidade de inserções e atualizações. Para fazer isso, usaremos o comando DROP INDEX. Nossa tabela foi criada assim:
CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR,
  LASTNAME CHAR,
  PRIMARY KEY (ID),
  INDEX idx (LASTNAME,FIRSTNAME)
);

Se quisermos remover o índice nas colunas LASTNAME e FIRSTNAME, emitiremos este comando:
DROP INDEX IDX ON EMPLOYEE;

Conclusão


Os índices de banco de dados são uma ferramenta fundamental que otimiza a velocidade de recuperação de dados dentro de uma estrutura que aproveita o desempenho de pesquisa e leitura em uma tabela. O aprimoramento do índice é direcionado principalmente ao custo de mais gravações e/ou espaço de armazenamento para manter uma estrutura de dados de índice ideal.

Os bancos de dados MySQL e MariaDB oferecem várias outras opções de pesquisa e leitura, incluindo muitas que não foram abordadas aqui. As principais conclusões aqui incluem:
  • Certifique-se de reservar um tempo para planejar suas mesas com antecedência.
  • Se você não planejar com antecedência ao criar as tabelas, avalie as colunas que estão sendo mais pesquisadas e crie um índice para elas.

Veja em ação!


Nossa ampla linha de servidores dedicados fornece o poder, a estabilidade e a segurança necessários para hospedar o menor banco de dados para empresas em crescimento até uma configuração de servidores em cluster de alta disponibilidade para as maiores corporações. Quer ver quais soluções podemos oferecer para atender às suas necessidades?

Ligue para 800.580.4985, ou abra um chat ou ticket conosco para falar com um de nossos consultores experientes em Soluções ou Hospedagem para saber como você pode aproveitar essa tecnologia hoje!
Navegação da série<>