Professional Documents
Culture Documents
INSERT INTO agenda VALUES (0, 'Juan Pérez', 'C/ Laguna, 15. Sevilla',
'95.455.55.55', 'juan@agenda.com' )\g
INSERT INTO agenda VALUES (1, 'Luis García', 'C/ Betis, 22. Cádiz',
'95.655.66.33', 'luis@agenda.com' )\g
INSERT INTO agenda VALUES (2, 'Carlos Rodríguez', 'C/ Sevilla, 6. Huelva',
'95.113.22.77', 'carlos@agenda.com' )\g
Debemos tener en cuenta que los comandos de arriba debe escribirse cada uno en una sola línea. Se han
separado para aumentar la legibilidad del código.
Ahora desde la línea de comandos ejecuta:
cat mybd.dump | mysql mybd
Cabe destacar el campo id, que no puede estar vacio, y además es autoincrementable, lo cuál
deberemos tener en cuenta a la hora de actualizar y añadir registros. Si no hemos cometido ningún error,
ya tenemos nuestra base de datos de ejemplo en el servidor MySQL.
Creación de índices
Existen cuatro tipos de índices que podemos utilizar en MySQL; de clave primaria, únicos, de texto
completo, y ordinarios. Cada uno de ellos será explicado a continuación.
Índices ordinarios
Un índice que no es primario permite valores duplicados (a menos que los campos hayan sido
especificados como UNIQUE).
Para crear un índice ordinario tenemos básicamente dos opciones:
1. Podemos crear un índice ordinario al mismo tiempo que creamos la tabla con el uso de la opción
INDEX.
3. De igual manera, podemos crear el índice con el uso de la sentencia ALTER TABLE si es que la
tabla ya existe.
ALTER TABLE nombreTabla ADD INDEX [nombreIndice] (campo1 [,campo2...]);
También es posible usar la sentencia CREATE INDEX para crear un índice en una tabla existente.
CREATE INDEX nombreIndice ON nombreTabla(campo1 [,campo2...]);
Ambas sentencias piden el nombre del índice, sin embargo con la sentencia CREATE INDEX el
nombre es obligatorio.
Por ejemplo, para la siguiente definición de tabla:
CREATE TABLE usuarios(id int, nombre varchar(50), apellidos varchar(70));
Se puede crear un índice en la columna apellidos con una sentencia ALTER TABLE:
ALTER TABLE usuarios ADD INDEX idx_apellidos (apellidos);
O bien, con una sentencia CREATE INDEX:
CREATE INDEX idx_apellidos ON usuarios(apellidos);
Índices de texto completo
Los índices de texto completo son del tipo FULLTEXT, se usan en tablas del tipo MyISAM, y pueden
contener uno o más campos del tipo CHAR, VARCHAR y TEXT. Un índice de texto completo está diseñado
para facilitar y optimizar la búsqueda de palabras clave en tablas que tienen grandes cantidades de
información en campos de texto.
Para crear un índice de texto completo tenemos básicamente dos opciones:
1. Crear el índice al momento de crear la tabla.
2. CREATE TABLE nombreTabla( campo1 TIPO, campo2 TIPO,
FULLTEXT [nombreIndice] (campo1 [campo2,...]) );
3. Crear el índice una vez que ha sido creada la tabla.
ALTER TABLE nombreTabla ADD FULTEXT [nombreIndice] (campo1 [,campo2,...]);
La siguiente sentencia también se puede usar para crear un índice cuando la tabla ya existe.
CREATE FULLTEXT INDEX nombreIndice ON nombreTabla(campo1 [,campo2,...]);
Unicamente para fines ilustrativos, consideremos la siguiente definición de tabla:
CREATE TABLE usuarios(id int, nombre varchar(50), apellidos varchar(70));
Podríamos crear un índice FULLTEXT en la columna nombre, en la columna apellidos, o bien, un índice
que ocupe ambos campos. A continuación se muestran los tres casos.
CREATE FULLTEXT INDEX idx_nombre ON usuarios(nombre);
Índices únicos
Los índices únicos son básicamente como los índices ordinarios, excepto que los valores duplicados no
son permitidos.
Para crear un índice UNIQUE se tienen básicamente dos opciones:
1. Crear un índice único cuando la tabla es creada con el uso de la opción UNIQUE.
2. CREATE TABLE nombreTabla(campo1 tipoDato, campo2 tipoDato,..
UNIQUE [nombreIndice] (campo1 [,campo2...]));
Índices compuestos
Los índices compuestos son simplemente aquellos que están basados en múltiples columnas. MySQL
únicamente usa un índice por tabla cuando está procesando una consulta. Esto significa que si tenemos
varias columnas que frecuentemente aparecen juntas en una cláusula WHERE, tenemos la oportunidad de
acelerar estas consultas al crear un índice compuesto.
Si una tabla tiene un índice formado por múltiples columnas, cualquier prefijo más a la izquierda puede
ser usado por el optimizador de consultas de MySQL para encontrar las filas. Por ejemplo, si tenemos un
índice compuesto por tres columnas (col1, col2, col3), tendríamos capacidades de búsqueda en (col1),
(col1, col2) y (col1, col2, col3).
MySQL no puede usar un índice parcial si las columnas no forman un prefijo más a la izquierda del índice.
Supongamos que tenemos unas sentencias SELECT como estas:
mysql> SELECT * FROM algunaTabla WHERE col1=valor1;
mysql> SELECT * FROM algunaTabla WHERE col2=valor2;
mysql> SELECT * FROM algunaTabla WHERE col2=valor2 AND col3=valor3;
Si el índice existe en (col1, col2, col3), sólo la primera de estas consultas usará el índice. La segunda y la
tercera involucran a las columnas en el índice, pero (col2) y (col2, col3) no son los prefijos más a la
izquierda de (col1, col2, col3).
Este es otro ejemplo. Consideremos la siguiente definición de una tabla:
CREATE TABLE usuarios(id int, nombre varchar(50), apellidos varchar(70));
Si frecuentemente hacemos consultas en la tabla usuarios basadas en el nombre como en los apellidos,
podemos beneficiarnos de un índice compuesto en las columnas nombre y apellidos.
ALTER TABLE usuarios ADD INDEX idx_nombre(nombre, apellidos);
Debido a la forma en que MySQL construye los índices compuestos, éste puede usar el índice
idx_nombre para resolver consultas basadas sólo en el nombre, o en el nombre y los apellidos, sin
embargo, no usará el índice en una consulta que haga referencia únicamente a la columna apellidos.
Por ejemplo, de las siguientes tres consultas, sólo las dos primeras harían uso de nuestro índice
idx_nombre.
SELECT * FROM usuarios WHERE nombre='Eduardo';
SELECT * FROM usuarios WHERE nombre='Eduardo' AND apellidos='Zarate M';
SELECT * FROM usuarios WHERE apellidos='Zarate M';
La idea es que los índices compuestos pueden usarse frecuentemente para acelerar algunas consultas
complejas, pero necesitamos entender sus limitaciones y debemos ejecutar algún tipo de prueba en vez
de asumir que estos índices siempre nos van a ayudar.