MySQL
Índices y claves
Buscar..
Sintaxis
- Crear índice simple.
CREAR index_name ÍNDICE DE LA nombre_tabla (nombre1_columna [, COLUMN_NAME2, ...])
- Crear índice único
CREAR index_name índice único en nombre_tabla (nombre1_columna [, COLUMN_NAME2, ...]
- Índice de caída
DROP INDEX index_name ON tbl_name [ algorithm_option | lock_option ] ...
algorithm_option: ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option: LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
Observaciones
Conceptos
Un índice en una tabla MySQL funciona como un índice en un libro.
Supongamos que tiene un libro sobre bases de datos y desea encontrar información sobre, por ejemplo, almacenamiento. Sin un índice (suponiendo que no haya ninguna otra ayuda, como una tabla de contenido), tendría que recorrer las páginas una por una, hasta que encuentre el tema (que es un "análisis de tabla completa"). Por otro lado, un índice tiene una lista de palabras clave, por lo que debe consultar el índice y ver que el almacenamiento se menciona en las páginas 113-120, 231 y 354. Luego, puede ir directamente a esas páginas, sin buscarlas (eso es una búsqueda con un índice, algo más rápido).
Por supuesto, la utilidad del índice depende de muchas cosas, algunos ejemplos, utilizando el símil anterior:
- Si tenía un libro sobre bases de datos e indexó la palabra "base de datos", podría ver que se menciona en las páginas 1-59, 61-290 y 292-400. Eso es un montón de páginas, y en tal caso, el índice no es de mucha ayuda y podría ser más rápido recorrer las páginas una por una. (En una base de datos, esto es "mala selectividad".)
- Para un libro de 10 páginas, no tiene sentido hacer un índice, ya que puede terminar con un libro de 10 páginas con el prefijo de un índice de 5 páginas, lo cual es una tontería, simplemente escanee las 10 páginas y listo. .
- El índice también debe ser útil; por lo general, no tiene sentido indexar, por ejemplo, la frecuencia de la letra "L" por página.
Crear índice
-- Create an index for column 'name' in table 'my_table'
CREATE INDEX idx_name ON my_table(name);
Crear un índice único
Un índice único impide la inserción de datos duplicados en una tabla. NULL
valores NULL
se pueden insertar en las columnas que forman parte del índice único (ya que, por definición, un valor NULL
es diferente de cualquier otro valor, incluido otro valor NULL
)
-- Creates a unique index for column 'name' in table 'my_table'
CREATE UNIQUE INDEX idx_name ON my_table(name);
Índice de caída
-- Drop an index for column 'name' in table 'my_table'
DROP INDEX idx_name ON my_table;
Crear índice compuesto
Esto creará un índice compuesto de ambas claves, mystring
y mydatetime
y acelerará las consultas con ambas columnas en la cláusula WHERE
.
CREATE INDEX idx_mycol_myothercol ON my_table(mycol, myothercol)
Nota: ¡ El orden es importante! Si la consulta de búsqueda no incluye ambas columnas en la cláusula WHERE
, solo puede usar el índice de la izquierda. En este caso, una consulta con mycol
en el WHERE
utilizará el índice, una consulta que myothercol
sin buscar también mycol
no . Para más información echa un vistazo a esta entrada de blog .
Nota: Debido a la forma en que funciona BTREE, las columnas que generalmente se consultan en rangos deben ir en el valor más a la derecha. Por ejemplo, las columnas DATETIME
suelen consultar como WHERE datecol > '2016-01-01 00:00:00'
. Los índices BTREE manejan los rangos de manera muy eficiente, pero solo si la columna que se consulta como rango es la última en el índice compuesto.
Tecla AUTO_INCREMENT
CREATE TABLE (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY(id),
... );
Notas principales:
- Comienza con 1 e incrementa en 1 automáticamente cuando no puede especificarlo en
INSERT
, o lo especifica comoNULL
. - Los identificadores siempre son distintos entre sí, pero ...
- No haga suposiciones (sin espacios, generados consecutivamente, no reutilizados, etc.) sobre los valores de la identificación que no sean únicos en un momento dado.
Notas sutiles:
- Al reiniciar el servidor, el valor 'siguiente' se 'calcula' como
MAX(id)+1
. - Si la última operación antes de apagar o colapsar fue eliminar la ID más alta, esa ID se puede reutilizar (esto depende del motor). Por lo tanto, no confíe en que auto_increments sea permanentemente único ; Solo son únicos en cualquier momento.
- Para soluciones multi-master o agrupadas, vea
auto_increment_offset
yauto_increment_increment
. - Está bien tener otra cosa como la
PRIMARY KEY
y simplemente hacerINDEX(id)
. (Esta es una optimización en algunas situaciones). - El uso de
AUTO_INCREMENT
como la "clave dePARTITION
" rara vez es beneficioso; hacer algo diferente. - Varias operaciones pueden "quemar" valores. Esto sucede cuando asignan previamente los valores, luego no los use:
INSERT IGNORE
(con clave de duplicación),REPLACE
(que esDELETE
másINSERT
) y otros.ROLLBACK
es otra causa de lagunas en los identificadores. - En la Replicación, no puede confiar en que los identificadores lleguen a los esclavos en orden ascendente. Aunque los identificadores se asignan en orden consecutivo, las declaraciones de InnoDB se envían a los esclavos en el orden
COMMIT
.