Tengo una tabla MySQL muy grande con aproximadamente 150,000 filas de datos. Actualmente, cuando intento ejecutar
SELECT * FROM table WHERE id = '1';
el código funciona bien ya que el campo ID es el índice primario. Sin embargo, para un desarrollo reciente en el proyecto, tengo que buscar en la base de datos por otro campo. Por ejemplo:
SELECT * FROM table WHERE product_id = '1';
Este campo no fue indexado previamente; sin embargo, he agregado uno, por lo que mysql ahora indexa el campo, pero cuando intento ejecutar la consulta anterior, se ejecuta muy lentamente. Una consulta EXPLAIN revela que no hay índice para el campo product_id cuando ya he agregado uno, y como resultado la consulta tarda entre 20 minutos y 30 minutos en devolver una sola fila.
Mis resultados completos de EXPLAIN son:
| id | select_type | table | type | possible_keys| key | key_len | ref | rows | Extra |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
Puede ser útil tener en cuenta que acabo de echar un vistazo, y el campo ID se almacena como INT, mientras que el campo PRODUCT_ID se almacena como VARCHAR. ¿Podría ser esta la fuente del problema?
fuente
EXPLAIN
resultados completos ? ¿Estás seguro de que no hay índice? ¿O el índice está allí, pero MySQL está eligiendo no usarlo?Respuestas:
Nunca te compares
integer
constrings
MySQL. Siid
es asíint
, elimine las comillas.fuente
SHOW INDEXES FROM YOURTABLE
dev.mysql.com/doc/refman/5.0/en/show-index.html para verificar si se han agregado los índicesfuente
ALTER TABLE tbl ADD INDEX (col)
en lugar deALTER TABLE tbl ADD INDEX col (col)
, a continuación, utilizandoALTER TABLE tbl ADD INDEX (col)
más de una vez, seguir añadiendo índices nombradoscol_2
,col_3
, ... cada vez. Mientras que usando laALTER TABLE tbl ADD INDEX col (col)
2da vez, daráERROR 1061 (42000): Duplicate key name 'col'
.Puede usar esta sintaxis para agregar un índice y controlar el tipo de índice (HASH o BTREE).
Puede obtener información sobre las diferencias entre los índices BTREE y HASH aquí: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
fuente
Vale la pena señalar que múltiples índices de campo pueden mejorar drásticamente el rendimiento de su consulta. Entonces, en el ejemplo anterior, asumimos que ProductID es el único campo para buscar, pero si la consulta dijera ProductID = 1 AND Category = 7, entonces ayuda un índice de múltiples columnas. Esto se logra con lo siguiente:
Además, el índice debe coincidir con el orden de los campos de consulta. En mi ejemplo extendido, el índice debería ser (ProductID, Category) y no al revés.
fuente
the index should match the order of the query fields
?Se pueden agregar índices de dos tipos: cuando define una clave primaria, MySQL la tomará como índice de forma predeterminada.
Explicación
Clave primaria como índice
Considere que tiene una
tbl_student
tabla y deseastudent_id
como clave principal:La declaración anterior agrega una clave primaria, lo que significa que los valores indexados deben ser únicos y no pueden ser NULL.
Especificar nombre de índice
La declaración anterior creará un índice ordinario con
student_index
nombre.Crear índice único
Aquí,
student_unique_index
es el nombre de índice asignado a student_id y crea un índice para el que los valores deben ser únicos (aquí se puede aceptar nulo).Opción de texto completo
La declaración anterior creará el nombre del índice de texto completo con el
student_fulltext_index
que necesita MyISAM Mysql Engine.¿Cómo eliminar índices?
¿Cómo verificar los índices disponibles?
fuente
Dices que tienes un índice, la explicación dice lo contrario. Sin embargo, si realmente lo hace, así es como continuar:
Si tiene un índice en la columna y MySQL decide no usarlo, puede ser porque:
ANALYZE TABLE
ayuda.En el caso de (2) o (3), puede convencer a MySQL para que use el índice mediante la sintaxis de pista de índice , pero si lo hace, asegúrese de ejecutar algunas pruebas para determinar si realmente mejora el rendimiento para usar el índice tal como lo indica. .
fuente