Eu tenho uma tabela MySQL muito grande com cerca de 150.000 linhas de dados. Atualmente, quando tento executar
SELECT * FROM table WHERE id = '1';
o código funciona bem, pois o campo ID é o índice principal. No entanto, para um desenvolvimento recente no projeto, tenho que pesquisar no banco de dados por outro campo. Por exemplo:
SELECT * FROM table WHERE product_id = '1';
Este campo não foi indexado anteriormente; no entanto, eu adicionei um, então o mysql agora indexa o campo, mas quando tento executar a consulta acima, ela é executada muito lentamente. Uma consulta EXPLAIN revela que não há um índice para o campo product_id quando eu já adicionei um, e, como resultado, a consulta leva de 20 a 30 minutos para retornar uma única linha.
Meus resultados completos de EXPLAIN são:
| id | select_type | table | type | possible_keys| key | key_len | ref | rows | Extra |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
Pode ser útil observar que acabei de dar uma olhada e o campo ID é armazenado como INT, enquanto o campo PRODUCT_ID é armazenado como VARCHAR. Essa poderia ser a fonte do problema?
fonte
EXPLAIN
resultados completos ? Você tem certeza de que não há índice? Ou o índice está lá, mas o MySQL está optando por não usá-lo?Respostas:
Nunca compare
integer
com ostrings
MySQL. Seid
forint
, remova as aspas.fonte
SHOW INDEXES FROM YOURTABLE
dev.mysql.com/doc/refman/5.0/en/show-index.html para verificar se os índices foram adicionadosfonte
ALTER TABLE tbl ADD INDEX (col)
em vez deALTER TABLE tbl ADD INDEX col (col)
, em seguida, usandoALTER TABLE tbl ADD INDEX (col)
mais de uma vez vai continuar a acrescentar chamada índicescol_2
,col_3
... cada vez. Considerando que usando aALTER TABLE tbl ADD INDEX col (col)
segunda vez, daráERROR 1061 (42000): Duplicate key name 'col'
.Você pode usar esta sintaxe para adicionar um índice e controlar o tipo de índice (HASH ou BTREE).
Você pode aprender sobre as diferenças entre os índices BTREE e HASH aqui: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
fonte
Vale a pena notar que vários índices de campo podem melhorar drasticamente o desempenho da sua consulta. Portanto, no exemplo acima, assumimos que ProductID é o único campo a ser pesquisado, mas se a consulta diz ProductID = 1 AND Category = 7, um índice de várias colunas ajuda. Isso é alcançado com o seguinte:
Além disso, o índice deve corresponder à ordem dos campos da consulta. No meu exemplo estendido, o índice deve ser (ProductID, Category) e não o contrário.
fonte
the index should match the order of the query fields
?Índices de dois tipos podem ser adicionados: quando você define uma chave primária, o MySQL a toma como índice por padrão.
Explicação
Chave primária como índice
Considere que você tem uma
tbl_student
tabela e desejastudent_id
como chave primária:A instrução acima adiciona uma chave primária, o que significa que os valores indexados devem ser exclusivos e não podem ser NULL.
Especifique o nome do índice
A instrução acima criará um índice comum com o
student_index
nome.Crie um índice exclusivo
Aqui,
student_unique_index
é o nome do índice atribuído a student_id e cria um índice para o qual os valores devem ser exclusivos (aqui o nulo pode ser aceito).Opção de texto completo
A instrução acima criará o nome do índice de texto completo com
student_fulltext_index
qual você precisará do MyISAM Mysql Engine.Como remover índices?
Como verificar os índices disponíveis?
fonte
Você diz que tem um índice, a explicação diz o contrário. No entanto, se você realmente faz, é assim que continua:
Se você tem um índice na coluna e o MySQL decide não usá-lo, pode ser porque:
ANALYZE TABLE
ajuda.No caso de (2) ou (3), você pode convencer o MySQL a usar o índice pela sintaxe da dica do índice , mas, se o fizer, certifique-se de executar alguns testes para determinar se realmente melhora o desempenho do uso do índice conforme você sugere. .
fonte