Trabalho de Desenvolvimento Índices do MySQL
Introdução Os índices em MySQL são, normalmente, armazenados em B-Trees, havendo excepções como os índices sobre colunas de tipo espacial, que usam R-Trees.
Potencialidades Para eliminar linhas que são consideradas: se for possível escolher entre mais do que um índice, o MySQL, normalmente, usa o que encontrar menos linhas. Em alguns casos uma query pode ser optimizada para encontrar valores sem consultar as linhas: se uma query apenas usar colunas de uma tabela que são numéricas e que formam o prefixo mais à esquerda de uma chave de índice, então os valores seleccionados podem ser encontrados a partir da árvore de índice.
Exemplo Se existe um índice multi-coluna em col1 e col2, as linhas pretendidas podem ser encontradas directamente. Se existirem dois índices, cada um sobre apenas uma coluna, o optimizador tenta encontrar o índice mais restritivo.
B-Tree Estes índices podem ser usados para comparação de colunas em expressões que usam os operadores =, >,>=, <, <= ou BETWEEN. Para o LIKE, só se o argumento é uma string constante que não começa com nenhum caracter “estranho”(wildcard character)
B-Tree Exemplo do funcionamento para o operador LIKE: SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; Devolve linhas com ‘Patrick’ <= coluna < ‘Patricl’ SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%'; Devolve linhas com ‘Pat’ <= coluna < ‘Pau’
Curiosidades Por vezes o MySQL não usa índices mesmo que estes existam. Se mesmo com o índice for necessário aceder a grande parte das linhas da tabela. Scan torna-se mais eficiente pois faz menos pesquisas. LIMIT faz com que seja usado índice na mesma pois pode encontrar mais rapidamente o número de linhas que são pretendidas.
Indíces Hash Apenas usados para comparações de igualdade ou desigualdade, não para intervalos. Não pode ser usado para optimizar a operação GROUP BY Não é possível determinar o # de linhas entre dois valores, logo não se pode escolher qual o índice a usar, se existirem dois ou mais. Apenas chaves de índice completas podem ser usadas para procurar uma linha.
Fontes http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html http://dev.mysql.com/doc/refman/5.1/en/multiple-column-indexes.htm http://dev.mysql.com/doc/refman/5.1/en/indexes.html