Diseño de índice
- Utilice el mismo tipo de campo para evitar que la conversión implícita provoque índices no válidos.
- Cree índices únicos en todos los conjuntos mínimos de campos o combinaciones de campos con unicidad.
Por ejemplo, hay una tabla que contiene los campos a, b, c, d, e y f. Si las combinaciones de campos ab y ef son únicas, se recomienda crear índices únicos para ab y ef respectivamente.
Incluso si se implementa un control de verificación completo en la capa de aplicación, se generan datos sucios siempre que no haya un índice único de acuerdo con la Ley de Murphy.
Antes de crear un índice único, considere si es útil para consultas. Los índices inútiles se pueden eliminar.
Evalúe el impacto de los índices adicionales en las operaciones INSERT. Determine si desea crear índices únicos en función de los requisitos para la exactitud y el rendimiento de los datos con exclusividad.
- Cree índices en campos de longitud fija (por ejemplo, INT). Al crear un índice en un campo VARCHAR, se debe especificar la longitud del índice. No es necesario crear un índice en todo el campo. La longitud del índice se determina de acuerdo con la distinción de texto real.
La longitud del índice y la distinción son un par de contradicciones. En general, para los datos de tipo cadena, la distinción de un índice con una longitud de 20 bytes será superior al 90 %. La fórmula de distinción es COUNT(DISTINCT LEFT(Column_name, Index_length))/COUNT(*). Coloque los nombres de columna con una distinción alta a la izquierda.
- Si es posible, no utilice la búsqueda difusa izquierda (por ejemplo, SELECT * FROM users WHERE u_name LIKE ' %hk') ni la búsqueda difusa completa en la página para evitar la degradación de la exploración de índice a la exploración de tabla completa. Resuelva el problema en la capa de aplicación.
Un archivo de índice tiene la característica de coincidencia de prefijos más a la izquierda del B-tree. Si no se determina el valor de la izquierda, no se puede utilizar el índice.
- Utilice un índice de cobertura para consultar datos y evitar volver a la tabla. Sin embargo, no agregue demasiados campos al índice de cobertura o el rendimiento de escritura se verá comprometido.
Los tipos de índices que se pueden crear incluyen índices de clave principal, índices únicos e índices normales. Un índice de cobertura indica que si ejecuta sentencias EXPLAIN, se mostrará "using index" en la columna Extra.
- Optimice el rendimiento de SQL de la siguiente manera: range (requisito mínimo), ref (requisito básico) y consts (requisito máximo).
- Al crear un índice compuesto, coloque la columna con la distinción más alta a la izquierda.
- Asegúrese de que el número de índices en una sola tabla sea como máximo 5, o no exceda el 20% del número de campos de tabla.
- Evite los siguientes malentendidos al crear índices:
- Los índices deben utilizarse con frecuencia. Es necesario crear un índice para una consulta.
- Los índices deben ser tan pocos como sea posible. Los índices consumen espacio y ralentizan las actualizaciones e inserciones.
- No se pueden utilizar índices únicos. Las características únicas se deben resolver en la capa de aplicación utilizando el método "consultar primero y luego insertar".
- Reduzca el uso de ORDER BY que no se puede usar con índices según los requisitos de servicio reales. Las sentencias como ORDER BY, GROUP BY y DISTINCT consumen muchos recursos de CPU.
- Si se trata de una sentencia SQL compleja, utilice el diseño de índice existente y agregue EXPLAIN antes de la sentencia SQL. EXPLAIN puede ayudarle a optimizar el índice mediante la adición de algunas restricciones de consulta.
- Ejecute las nuevas sentencias SELECT, UPDATE o DELETE con EXPLAIN para comprobar el uso del índice y asegurarse de que no se muestren Using filesort y Using temporary en la columna Extra. Si el número de filas analizadas es superior a 1,000, tenga cuidado al ejecutar estas sentencias. Analice los registros de consultas lentas y elimine las sentencias de consultas lentas no utilizadas todos los días.
EXPLAIN:
- type: ALL, index, range, ref, eq_ref, const, system, NULL (El rendimiento se clasifica de pobre a bueno de izquierda a derecha.)
- possible_keys: indica los índices desde los cuales MySQL pueden elegir encontrar filas en esta tabla. Si hay un índice en un campo, el índice aparece en la lista, pero no puede ser utilizado por la consulta.
- key: indica la clave (índice) que MySQL realmente decidió usar. Si clave es NULL, MySQL no encontró ningún índice que usar para ejecutar la consulta de manera más eficiente. Para forzar a MySQL a usar o ignorar un índice que aparece en la columna possible_keys, use FORCE INDEX, USE INDEX o IGNORE INDEX en la consulta.
- ref: muestra qué columnas o constantes se comparan con el índice nombrado en la columna clave para seleccionar filas de la tabla.
- rows: indica el número estimado de filas que se van a leer para los registros requeridos en función de las estadísticas de la tabla y la selección del índice.
- Extra:
- Using temporary: Para resolver la consulta, MySQL necesita crear una tabla temporal para contener el resultado. Esto suele ocurrir si la consulta contiene cláusulas GROUP BY y ORDER BY que muestran columnas de manera diferente.
- Using filesort: MySQL debe hacer una pasada extra para averiguar cómo recuperar las filas por orden.
- Using index: La información de la columna se recupera de la tabla usando solo información en el árbol de índices sin tener que hacer una búsqueda adicional para leer la fila real. Si se muestra Using where al mismo tiempo, indica que la información deseada necesita obtenerse usando el árbol de índices y leyendo filas de la tabla.
- Using where: En la cláusula WHERE, se muestra Using where cuando los datos de deseo se obtienen sin leer todos los datos de la tabla o los datos de deseo no se pueden obtener solo usando índices. A menos que específicamente tenga la intención de buscar o examinar todas las filas de la tabla, puede que tenga algo mal en su consulta si el valor Extra no es Using where y el tipo de combinación de tabla es ALL o index.
- Si se utiliza una función en una sentencia WHERE, el índice no es válido.
Por ejemplo, en WHERE left(name, 5) = 'zhang', la función left invalida el índice de name.
Puede modificar la condición en el lado del servicio y eliminar la función. Cuando el conjunto de resultados devuelto es pequeño, el lado del servicio filtra las filas que cumplen la condición.
- Para las tablas ultragrandes, también debe cumplir con las siguientes reglas al utilizar índices:
- Cree índices para las columnas involucradas en las instrucciones WHERE y ORDER BY. Puede utilizar EXPLAIN para comprobar si se utilizan índices o escaneos de tabla completa.
- Los campos con distribución de valores escasa, como gender con solo dos o tres valores, no se pueden indexar.
- No utilice campos de cadena como claves principales.
- No utilice claves externas. Los programas pueden imponer las restricciones.
- Cuando utilice índices de varias columnas, organícelos en el mismo orden que las condiciones de consulta y quite los índices de una sola columna innecesarios (si los hay).
- Antes de quitar un índice, realice un análisis exhaustivo y haga una copia de respaldo de los datos.