Los datos en una base de datos MySQL/MariaDB se almacenan en tablas. Una forma sencilla de pensar en los índices es imaginar una hoja de cálculo extensa. Este tipo de sistema no siempre es propicio para una búsqueda rápida; ahí es donde un índice se vuelve esencial. Si no hay índice, entonces el motor de la base de datos debe comenzar en la fila uno y navegar por todas las filas en busca de los valores correspondientes. Si se trata de una tabla pequeña, entonces no es gran cosa, pero en tablas y aplicaciones más grandes donde puede haber tablas con millones e incluso miles de millones de filas, se vuelve problemático. Como puede imaginar, buscar en esas filas una por una llevará mucho tiempo, incluso en el hardware más reciente. La solución es crear un ÍNDICE (o más de uno) para sus datos.
¿Qué es un índice?
Un índice es una tabla de búsqueda organizada que contiene punteros a dónde se pueden recuperar los datos en la base de datos. Este concepto es similar a los índices de libros. En un libro, el índice enumera los números de página donde se encuentran varios temas. En una base de datos, el índice almacena punteros que están en un orden lógico y ordenado, lo que permite búsquedas rápidas en la base de datos. Imagina un libro sin índice. Si desea buscar información sobre un tema específico, debe comenzar desde el principio y pasar las páginas hasta encontrar la información que está buscando. Un índice de libros resuelve esto diciéndote exactamente en qué páginas se encuentra la información que estás buscando. Básicamente, así es como funciona un índice de MySQL.
¿Cuándo utiliza índices MySQL?
Cada vez que el servidor de la base de datos tenga que buscar información, utilizará un índice para acelerar el proceso. Ejemplos de esto incluyen las cláusulas WHERE, JOIN ON, MIN/MAX y ORDER BY/GROUP BY. Si sus consultas van a buscar o coincidir con una columna a menudo en cualquiera de estas situaciones, debería considerar crear un índice.
¿Los índices mejoran el rendimiento de la base de datos?
La mayoría de las veces, la respuesta corta es sí. Para lecturas y búsquedas a través de los datos, los índices aumentan absolutamente el rendimiento. No hacer escaneos completos de la tabla mejorará casi cualquier consulta SELECT. Esto tiene un pequeño precio. Para las columnas que se manipulan con frecuencia, hay un costo por cada cambio. Esto puede atascar los INSERTOS y las ACTUALIZACIONES en la base de datos.
Tipos comunes de índices de MySQL
Hay tres tipos comunes de índices de MySQL:
- Clave principal
- Índice
- Único
CLAVE PRINCIPAL
Una clave primaria le dice al servidor de la base de datos cuál es la(s) columna(s) más crucial(es) en la tabla. Por lo general, esto se usa para columnas de id de incremento automático. Por ejemplo, si tiene una tabla que contiene información de empleados, querrá una clave principal en la columna "EMPLOYEE_ID". En otras tablas, es decir, una tabla de salarios, simplemente se referiría a EMPLOYEE_ID en lugar de a todos los datos del empleado.
ÍNDICE
Se utiliza un ÍNDICE estándar para decirle al servidor de la base de datos que una o más de las columnas de la tabla se buscarán mucho y, por lo tanto, se debe crear un índice en ellas. Esto se puede construir durante la creación de la tabla o si encuentra que necesita un índice en una columna más tarde, se puede agregar en ese momento.
ÚNICO
Un índice ÚNICO es un poco distinto en el sentido de que impone restricciones específicas sobre lo que se puede escribir en la tabla. Si intenta insertar una fila que contiene un valor que ya está incluido en los datos, INSERTAR producirá un error. Esto permite búsquedas rápidas, así como cierta integridad de datos.
Cómo crear un índice
Hay varias formas de crear un índice en una columna. Puede configurar un índice cuando CREATE TABLE, o después con las instrucciones ALTER TABLE o CREATE INDEX.
Creación de un índice PRIMARY KEY
La forma más sencilla de crear un índice PRIMARY KEY es hacerlo al crear la tabla. Usaremos un ejemplo de una tabla de empleados para este tutorial. La tabla tendrá tres columnas:ID, FIRSTNAME y LASTNAME. La creación puede verse así:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32)
);
Esta declaración creará la tabla sin un índice. Podemos agregar la clave principal con una declaración como esta:
ALTER TABLE EMPLOYEE
ADD CONSTRAINT PRIMARY KEY (ID);
Esto le dice a MySQL que tenemos una clave principal en la columna ID.
Una forma más sencilla de hacerlo es durante la creación de la tabla. Comenzando de nuevo, recrearemos la tabla y agregaremos la clave principal en una declaración.
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID)
);
Esta declaración única realiza las mismas tareas que las dos primeras declaraciones anteriores. Una clave principal puede contener más de una columna, pero todas las columnas deben ser únicas. La clave principal se puede utilizar para identificar cualquier fila individual de la tabla.
Crear un índice usando CREATE INDEX
Usando la tabla de ejemplo anterior, imagine que la empresa tiene miles de empleados y desea poder buscar a los empleados rápidamente por el apellido. Con una clave principal, solo puede haber una entrada. No puede tener varias personas que tengan la misma identificación de empleado. Con los apellidos, es bastante común que varias personas compartan ese nombre. Una vez más, hay algunas maneras de hacer esto. Usando la tabla anterior:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID)
);
Podemos agregar un índice a la columna LASTNAME como este:
CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);
Las búsquedas por APELLIDO ahora serán más rápidas en esta tabla. En este ejemplo, "idx1" es el nombre del índice. Esto hará que sea más fácil hacer referencia al índice en el futuro si es necesario.
Otra forma de agregar un índice a una tabla es con el comando ALTER TABLE. Para lograr lo mismo que hicimos con la instrucción anterior, ejecutaríamos el siguiente comando:
ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);
La forma final de agregar un índice que ahorraría algo de tiempo es hacerlo durante CREAR TABLA. Si sabe de antemano que buscará o se unirá a una columna específica, puede crear la tabla inicial con el índice ya allí:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID),
INDEX idx1 (LASTNAME)
);
Las tres declaraciones crean el mismo resultado.
Índices de varias columnas
Un índice no solo tiene que estar en una sola columna. Si queremos búsquedas más rápidas en FIRSTNAME y LASTNAME, podemos crear un índice en ambas columnas. En la creación de la tabla, se vería así:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
PRIMARY KEY (ID),
INDEX idx2 (LASTNAME,FIRSTNAME)
);
Usando el comando CREAR ÍNDICE:
CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);
Y finalmente, el comando ALTER TABLE:
ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);
Creando UN ÍNDICE ÚNICO
Puede haber momentos en los que desee crear un índice en una columna y también obligar a que todas las entradas de esa columna sean únicas. Si extendimos nuestra tabla de ejemplo para incluir una columna OFICINA (que indica qué oficina en el edificio tienen), entonces podemos querer hacer de esto un índice ÚNICO. Trabajemos con esta tabla:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR(32),
LASTNAME CHAR(32),
OFFICE INT,
PRIMARY KEY (ID)
);
Observe que ahora tenemos un número entero almacenado en la tabla para indicar qué cargo ocupa la persona. Esto puede hacer referencia a otra tabla, "OFICINAS", que contendrá información sobre varias oficinas en el edificio.
Para crear un índice sobre esto, emitiríamos el siguiente comando:
CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);
Puede usar comandos similares para crearlos en los comandos CREATE TABLE y ALTER TABLE. Ahora, si intentaste ejecutar estas dos inserciones:
INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);
INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);
Recibiría un error en el segundo INSERTAR:
Duplicate entry '1' for key 'idx3'
Eliminar un índice
Puede llegar un momento en que ya no desee un índice en una columna. Tal vez se dio cuenta de que no busca una columna con tanta frecuencia y que el índice está ralentizando las inserciones y actualizaciones. Para ello, utilizaremos el comando DROP INDEX. Nuestra tabla se creó así:
CREATE TABLE EMPLOYEE
(
ID INT,
FIRSTNAME CHAR,
LASTNAME CHAR,
PRIMARY KEY (ID),
INDEX idx (LASTNAME,FIRSTNAME)
);
Si queremos eliminar el índice de las columnas APELLIDO y NOMBRE, emitiremos este comando:
DROP INDEX IDX ON EMPLOYEE;
Conclusión
Los índices de bases de datos son una herramienta fundamental que optimiza la velocidad de recuperación de datos dentro de una estructura que aprovecha el rendimiento de búsqueda y lectura en una tabla. La mejora del índice se basa principalmente en el costo de más escrituras y/o espacio de almacenamiento para mantener una estructura de datos de índice óptima.
Las bases de datos MySQL y MariaDB ofrecen muchas otras búsquedas y opciones de lectura, incluidas muchas que no se trataron aquí. Los puntos clave aquí incluyen:
- Asegúrese de tomarse el tiempo para planificar sus mesas con anticipación.
- Si no planifica con anticipación al crear las tablas, evalúe las columnas que más se buscan y cree un índice para ellas.
¡Véalo en acción!
Nuestra amplia línea de servidores dedicados brinda la potencia, la estabilidad y la seguridad necesarias para alojar la base de datos más pequeña para empresas en crecimiento hasta una configuración de servidores en clúster de alta disponibilidad para las corporaciones más grandes. ¿Quiere ver qué soluciones podemos ofrecerle para satisfacer sus necesidades?
¡Llámenos al 800.580.4985, o abra un chat o un ticket con nosotros para hablar con uno de nuestros asesores expertos en Soluciones o Hosting experimentado para saber cómo puede aprovechar esta tecnología hoy!