Estou trabalhando em um banco de dados MySql , com uma tabela assim:
+--------------+
| table_name |
+--------------+
| myField |
+--------------+
...e eu preciso fazer muitas consultas como esta (com 5-10 strings na lista) :
SELECT myField FROM table_name
WHERE myField IN ('something', 'other stuff', 'some other a bit longer'...)
Haverá cerca de 24.000.000 linhas únicas
1) Devo usar uma tecla FULLTEXT
ou e INDEX
para o meu VARCHAR(150)
?
2) Se eu aumentar os chars de 150 para 220 ou 250... faria uma grande diferença? (Existe alguma maneira de calculá-lo?)
3) Como eu disse, eles serão únicos, então myField deve ser uma PRIMARY KEY . Não é raro adicionar uma PRIMARY KEY a um campo que já é um VARCHAR INDEX/FULLTEXT?
SUGESTÃO #1 : Indexação Padrão
Se você indexar assim, poderá procurar a string inteira ou fazer pesquisas LIKE orientadas à esquerda
SUGESTÃO #2 : Indexação de TEXTO COMPLETO
Você pode efetivamente usar pesquisas por palavras-chave individuais, bem como frases inteiras. Você precisará definir uma lista de palavras irrelevantes personalizada porque o MySQL não indexará 543 palavras .
Aqui estão meus outros posts dos últimos dois anos em índices FULLTEXT
May 23, 2011
: Otimizando a pesquisa de texto completo do mysql (StackOverflow)Oct 25, 2011
: índice FULLTEXT ignorado no MODO BOOLEAN com 'número de palavras' condicionalJan 26, 2012
: Otimização my.cnf de pesquisa de texto completo do MysqlMay 07, 2012
: MySQL EXPLAIN não mostra 'usar índice' para FULLTEXTSUGESTÃO #3 : Indexação de Hash
Se você estiver procurando por um valor específico e esses valores puderem ter comprimentos muito além de 32 caracteres, você poderá armazenar o valor de hash:
Dessa forma, você apenas procura por valores de hash para recuperar resultados
De uma chance !!!
O MySQL permite que você defina um índice prefixado, o que significa que você define os primeiros N caracteres da string original a ser indexada, e o truque é escolher um número N que seja longo o suficiente para fornecer boa seletividade, mas curto o suficiente para economizar espaço. O prefixo deve ser longo o suficiente para tornar o índice quase tão útil quanto seria se você indexasse a coluna inteira.
Antes de prosseguirmos, vamos definir alguns termos importantes. A seletividade do índice é a razão entre o total de valores indexados distintos e o número total de linhas . Aqui está um exemplo para a tabela de teste:
Se indexarmos apenas o primeiro caractere (N=1), então a tabela de índice se parecerá com a seguinte tabela:
Neste caso, a seletividade do índice é igual a IS=1/3 = 0,33.
Vejamos agora o que acontecerá se aumentarmos o número de caracteres indexados para dois (N=2).
Neste cenário IS=2/3=0,66 o que significa que aumentamos a seletividade do índice, mas também aumentamos o tamanho do índice. O truque é encontrar o número mínimo N que resultará na seletividade máxima do índice .
Existem duas abordagens que você pode fazer cálculos para sua tabela de banco de dados. Vou fazer uma demonstração no dump deste banco de dados .
Digamos que queremos adicionar a coluna last_name na tabela employees ao índice e queremos definir o menor número N que produzirá a melhor seletividade de índice.
Primeiro vamos identificar os sobrenomes mais frequentes:
Como você pode ver, o sobrenome Baba é o mais frequente. Agora vamos encontrar os prefixos last_name que ocorrem com mais frequência , começando com prefixos de cinco letras.
Há muito mais ocorrências de cada prefixo, o que significa que temos que aumentar o número N até que os valores sejam quase os mesmos do exemplo anterior.
Aqui estão os resultados para N=9
Aqui estão os resultados para N=10.
Isso são resultados muito bons. Isso significa que podemos fazer o índice na coluna last_name indexando apenas os primeiros 10 caracteres. Na definição da tabela, a coluna last_name é definida como
VARCHAR(16)
, e isso significa que salvamos 6 bytes (ou mais, se houver caracteres UTF8 no sobrenome) por entrada. Nesta tabela existem 1637 valores distintos multiplicados por 6 bytes é cerca de 9KB, e imagine como esse número cresceria se nossa tabela contivesse milhões de linhas.Você pode ler outras maneiras de calcular o número de N no meu post Índices prefixados no MySQL .
Usar funções MD5 e SHA1 para gerar valores que devem ser indexados também não é uma boa abordagem . Por quê? Leia no post Como escolher o tipo de dados correto para uma chave primária no banco de dados MySQL