Projeto e uso do índice de notas de estudo básico do MySQL

Desenho e uso do índice

1. Visão geral do índice

Todos os tipos de coluna do MySQL podem ser indexados. Usar índices em colunas relacionadas é a melhor maneira de melhorar o desempenho das operações SELECT. De acordo com o número de índice máximo e comprimento de índice máximo de cada tabela que o mecanismo de armazenamento pode definir, cada mecanismo de armazenamento suporta pelo menos 16 índices para cada tabela e o comprimento total do índice é de pelo menos 256 bytes.

As tabelas dos mecanismos de armazenamento MyISAM e InnoDB são todos índices BTREE criados por padrão . O MySQL atualmente não oferece suporte a índices funcionais, mas oferece suporte a índices de prefixo, ou seja, para criar um índice nos primeiros N caracteres do campo de índice. O comprimento do índice do prefixo está relacionado ao mecanismo de armazenamento.Para tabelas do mecanismo de armazenamento MyISAM, o comprimento do prefixo do índice pode chegar a 1000 bytes, enquanto para as tabelas do mecanismo de armazenamento InnoDB, o comprimento do prefixo do índice é de até 767 bytes.

O MySQL também suporta indexação de texto completo, que pode ser usada para pesquisa de texto completo. Mas na versão atual mais recente, apenas o mecanismo de armazenamento MyISAM suporta índices FULLTEXT e está limitado às colunas CHAR, VARCHAR e TEXT. Os índices são sempre executados em toda a coluna e os índices locais não são suportados.

Você também pode criar índices para tipos de colunas espaciais, mas apenas os índices de armazenamento MyISAM suportam índices espaciais e os campos indexados não devem estar vazios.

Por padrão, o mecanismo de armazenamento MEMORY usa o índice HASH, mas também oferece suporte ao índice BTREE .

Os índices podem ser criados ao mesmo tempo quando a tabela é criada ou novos índices podem ser adicionados a qualquer momento. A sintaxe para criar um novo índice é:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name(index_col_name,...)

index_col_name:
	col_name[(length)][ASC|DESC]

Você também pode usar a sintaxe de ALTER TABLE para adicionar índices. A sintaxe é semelhante a CREATE INDEX. Por exemplo, para criar um índice de prefixo de 10 bytes para a tabela de cidades:

mysql> create index cityname on city(city(10));
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

A sintaxe para exclusão do índice é:

DROP INDEX index_name ON tbl_name
mysql> drop index cityname on city;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

2. O princípio do design do índice

  • A coluna de índice a ser pesquisada não é necessariamente a coluna a ser selecionada. Em outras palavras, a coluna de índice mais adequada é a coluna que aparece na cláusula WHERE ou a coluna na cláusula de junção, em vez da coluna que aparece na lista de seleção após a palavra-chave SELECT.
  • Use um índice exclusivo. Considere a distribuição dos valores em uma coluna. Quanto maior a cardinalidade da coluna indexada, melhor será o efeito do índice.
  • Use índices curtos.
  • Use o prefixo mais à esquerda.
  • Não indexe em excesso.
  • Para as tabelas do mecanismo de armazenamento InnoDB, os registros serão salvos em uma determinada ordem por padrão. Se houver chaves primárias claramente definidas, eles serão salvos na ordem das chaves primárias. Se não houver uma chave primária, mas houver um índice exclusivo, ele será armazenado na ordem do índice exclusivo. Se não houver uma chave primária nem um índice exclusivo, uma coluna interna é gerada automaticamente na tabela e armazenada na ordem desta coluna.

3. Índice BTREE e índice HASH

As tabelas do mecanismo de armazenamento MEMORY podem escolher usar índice BTREE ou índice HASH , e os dois tipos diferentes de índices têm faixas de uso diferentes. O índice HASH tem algumas características importantes que requerem atenção especial ao usá-lo:

  • Usado apenas para comparações de igualdade usando operadores = ou <=>;
  • O otimizador não pode usar o índice HASH para acelerar as operações ORDER BY;
  • O MySQL não pode determinar aproximadamente quantas linhas existem entre os dois valores. Se uma tabela MyISAM for alterada para uma tabela MEMORY indexada por HASH, isso afetará a eficiência de execução de algumas consultas;
  • Use apenas a palavra-chave inteira para pesquisar uma linha.

Para índices BTREE, ao usar>, <,> =, <=, BETWEEN,! = Ou <>, ou o operador LIKE'pattern ', você pode usar o índice na coluna relevante.

As seguintes consultas de intervalo são aplicáveis ​​ao índice BTREE e índice HASH:

SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20);

As seguintes consultas de intervalo são aplicáveis ​​apenas a índices BTREE:

SELECT * FROM t1 WHERE key_col > 1 AND key_col < 10;
SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'lisa' AND 'simon';

Por exemplo, crie uma tabela de mecanismo de armazenamento MEMORY city_memory que seja idêntica à tabela de cidade:

mysql> CREATE TABLE city_memory( 
	 > city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
	 > city VARCHAR(50) NOT NULL,
     > country_id SMALLINT UNSIGNED NOT NULL,
     > last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     > PRIMARY KEY(city_id), KEY idx_fk_country_id (country_id) )ENGINE=Memory DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)

Ao usar uma tabela de memória, se for um índice HASH criado por padrão, você deve prestar atenção à escrita de instruções SQL para garantir que o índice superior possa ser usado. Se você deve usar uma consulta de intervalo, ao criar um índice, você deve escolher criar um índice BTREE.


4. Resumo

Os índices são usados ​​para encontrar rapidamente linhas com um valor específico em uma coluna . Se você não usar um índice, o MySQL deve começar com o primeiro registro e então ler a tabela inteira até encontrar as linhas relevantes. Quanto maior a mesa, mais tempo leva. Se a coluna de consulta na tabela tiver um índice, o MySQL pode chegar rapidamente a um local para pesquisar no meio do arquivo de dados, e não há necessidade de examinar todos os dados.

A maioria dos índices do MySQL (como PRIMARY KEY, UNIQUE, INDEX e FULLTEXT, etc.) são armazenados em BTREE. Apenas o índice espacial usa BTREE e a tabela MEMORY também oferece suporte ao índice HASH.

Acho que você gosta

Origin blog.csdn.net/qq_36879493/article/details/108541467
Recomendado
Clasificación