Indices en workbench

11
Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos Alumna Adriana Berenice Saucedo Guerrero Profesor Omar Emmanuel Lara Juarez Materia Base de Datos II Grado y Grupo 3° “A” Carrera Tecnologías de la Información y Comunicación

Transcript of Indices en workbench

Page 1: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

Alumna

Adriana Berenice Saucedo Guerrero

Profesor

Omar Emmanuel Lara Juarez

Materia

Base de Datos II

Grado y Grupo

3° “A”

Carrera

Tecnologías de la Información y Comunicación

Page 2: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

INDICE

Que es un Indice ......................................................................................................................................... 3

PARA QUE SIRVEN LOS INDICES ...................................................................................................... 4

COMO CREAR INDICES EN WORKBENCH .................................................................................................... 4

ELIMINAR INDICES ...................................................................................................................................... 9

Page 3: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

Que es un Indice

Los índices en MySQL permiten localizar y devolver registros de una forma sencilla y

rápida. Son especialmente útiles cuando queremos buscar elementos de entre los

millones y hasta billones de registros que puede contener una tabla en un momento

dado. Cuando no usamos índices, a veces podemos percibir que MySQL tarda

demasiado en responder una consulta o, incluso para usuarios inexpertos, puede

parecer que se ha creado un índice pero que no se siente una mejora en la velocidad.

Page 4: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

PARA QUE SIRVEN LOS INDICES

Los índices son usados para encontrar rápidamente los registros que tengan un determinado valor en alguna de sus columnas. Sin un índice, MySQL tiene que iniciar con el primer registro y leer a través de toda la tabla para encontrar los registros relevantes. Aún en tablas pequeñas, de unos 1000 registros, es por lo menos 100 veces más rápido leer los datos usando un índice, que haciendo una lectura secuencial. Cuando MySQL trata de responder una consulta, examina una variedad de estadísticas acerca de nuestros datos y decide como buscar los datos que deseamos de la manera más rápida. Sin embargo, como se acaba de mencionar, cuando en una tabla no existen índices en los cuales pueda auxiliarse MySQL para resolver una consulta se tendrán que leer todos los registros de la tabla de manera secuencial. Esto es comúnmente llamado un "escaneo completo de una tabla", y es muchas veces algo que se debe evitar. En particular, debemos evitar las escaneos completos de tablas por las siguientes razones:

Sobrecarga de CPU. El proceso de checar cada uno de los registros en una tabla es insignificante cuando se tienen pocos datos, pero puede convertirse en un problema a medida que va aumentando la cantidad de registros en nuestra tabla. Existe una relación proporcional entre el número de registros que tiene una tabla y la cantidad de tiempo que le toma a MySQL revisarla completamente.

Concurrencia. Mientras MySQL está leyendo los datos de una tabla, éste la bloquea, de tal manera que nadie más puede escribir en ella, aunque si pueden leerla. Cuando MySQL está actualizando o eliminando filas de una tabla, éste la bloquea, y por lo tanto nadie puede al menos leerla.

Sobrecarga de disco. En una tabla muy grande, un escaneo completo consume una gran cantidad de entrada/salida en el disco. Esto puede alentar siginificativamente nuestro servidor de bases de datos, especialmente si tenemos un disco IDE algo antiguo.

COMO CREAR INDICES EN WORKBENCH CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

[USING index_type]

ON tbl_name (index_col_name,...)

index_col_name:

col_name [(length)] [ASC | DESC]

Page 5: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

En MySQL 5.0, CREATE INDEX se mapea a un comando ALTER TABLE para crear

índices. Consulte Normalmente, crea todos los índices en una tabla cuando se crea la

propia tabla con CREATE TABLE. Consulte. CREATE INDEX le permite añadir índices

a tablas existentes.

Una lista de columnas de la forma (col1,col2,...) crea un índice de múltiples columnas.

Los valores de índice se forman al concatenar los valores de las columnas dadas.

Para columnas CHAR y VARCHAR, los índices pueden crearse para que usen sólo

parte de una columna, usandocol_name(length) para indexar un prefijo consistente en

los primeros length caracteres de cada valor de la columna. BLOB t TEXT pueden

indexarse, pero se debe dar una longitud de prefijo.

El comando mostrado aquí crea un índice usando los primeros 10 caracteres de la

columna name :

CREATE INDEX part_of_name ON customer (name(10));

Como la mayoría de nombres usualmente difieren en los primeros 10 caracteres, este

índice no debería ser mucho más lento que un índice creado con la

columna name entera. Además, usar columnas parcialmente para índices puede hacer

un fichero índice mucho menor, que puede ahorrar mucho espacio de disco y además

acelarar las operaciones INSERT .

Los prefijos pueden tener una longitud de hasta 255 bytes. Para

tablas MyISAM y InnoDB en MySQL 5.0, pueden tener una longitud de hasta 1000

bytes . Tenga en cuenta que los límites de los prefijos se miden en bytes, mientras que

la longitud de prefijo en comandos CREATE INDEX se interpreta como el número de

caracteres. Tenga esto en cuenta cuando especifique una longitud de prefijo para una

columna que use un conjunto de caracteres de múltiples bytes.

En MySQL 5.0:

Puede añadir un índice en una columna que puede tener valores NULL sólo si está

usando MyISAM, InnoDB, oBDB .

Puede añadir un índice en una columna BLOB o TEXT sólo si está usando el tipo de

tabla MyISAM, BDB, o InnoDB .

Una especificación index_col_name puede acabar con ASC o DESC. Estas palabras

se permiten para extensiones futuras para especificar almacenamiento de índice

ascendente o descendente. Actualmente se parsean pero se ignoran; los valores de

índice siempre se almacenan en orden ascendente.

Page 6: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

En MySQL 5.0, algunos motores le permiten especificar un tipo de índice cuando se

crea un índice. La sintaxis para el especificador index_type es USING type_name.

Los valores type_name posibles soportados por distintos motores se muestran en la

siguiente tabla. Donde se muestran múltiples tipos de índice , el primero es el tipo por

defecto cuando no se especifica index_type .

Motor de almacenamiento Tipos de índice permitidos

MyISAM BTREE

InnoDB BTREE

MEMORY/HEAP HASH, BTREE

Ejemplo:

CREATE TABLE lookup (id INT) ENGINE = MEMORY;

CREATE INDEX id_index USING BTREE ON lookup (id);

TYPE type_name puede usarse como sinónimo de USING type_name para

especificar un tipo de índice. Sin embargo, USING es la forma preferida. Además, el

nombre de índice que precede el tipo de índice en la especificación de la sintaxis de

índice no es opcional con TYPE. Esto es debido a que, en contra de USING, TYPEno

es una palabra reservada y se interpreta como nombre de índice.

Si especifica un tipo de índice que no es legal para un motor de almacenamiento, pero

hay otro tipo de índice disponible que puede usar el motor sin afectar los resultados de

la consulta, el motor usa el tipo disponible.

Índices FULLTEXT en MySQL puede indexar sólo columnas CHAR, VARCHAR,

y TEXT , y sólo en tablas MyISAM .

Ejemplo

CREATE TABLE `tbl_example` ( `tbl_example_ID` INT(10) UNSIGNED NOT NULL ,

`field1` VARCHAR(45) NULL ,

`field2` VARCHAR(45) NULL ,

PRIMARY KEY (`tbl_example_ID`) , UNIQUE INDEX `tbl_example_ID_UNIQUE` (`tbl_example_ID` ASC) )

ENGINE = MyISAM

Page 7: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

ALTER TABLE le permite cambiar la estructura de una tabla existente. Por ejemplo,

puede añadir o borrar columnas, crear o destruir índices, cambiar el tipo de columnas

existentes, o renombrar columnas o la misma tabla. Puede cambiar el comentario de la

tabla y su tipo.

La sintaxis para varias de las alteraciones permitidas es similar a cláusulas del

comando CREATE TABLE. Esto incluye modificaciones table_options , para opciones

tales como ENGINE, AUTO_INCREMENT, yAVG_ROW_LENGTH. Algunas

operaciones pueden producir advertencias si se intentan en una tabla para que el motor

de almacenamiento no soporte la operación. Estas advertencias pueden mostrarse

con SHOW WARNINGSSi usa ALTER TABLE para cambiar la especificación de una

columna pero DESCRIBE tbl_name indica que la columna no ha cambiado, es posible

que MySQL haya ignorado las modificaciones por alguna de las razones descrita.

Índices de clave primaria Una clave primaria es un índice sobre uno o más campos donde cada valor es único y ninguno de los valores son NULL. Para crear un índice de clave primaria tenemos básicamente dos opciones: 1. Crear el índice de clave primaria al momento de crear la tabla. En este caso se usa la opción PRIMARY KEY al final de la definición de los campos, con una lista de los campos que serán parte del índice.

CREATE TABLE nombreTabla(campo1 tipoDato, [campo2...,] PRIMARY KEY (campo1 [,campo2...]) ); Hacemos énfasis en que la palabra clave NOT NULL es obligatoria para un campo cuando éste vaya a formar parte de una clave primaria; como mencionamos anteriormente, las claves primarias no pueden contener valores nulos. Si intentamos crear una clave primaria sobre un campo nulo, MySQL nos marcará un error. 2. Crear una clave primaria en una tabla existente con el uso del comando ALTER TABLE: ALTER TABLE nombreTabla ADD PRIMARY KEY(campo1 [,campo2...]); Por ejemplo, suponiendo que ya tenemos en nuestro sistema una tabla que fue creada de la siguiente manera (sin clave primaria, y con el campo id aceptando valores NUL): CREATE TABLE usuarios(id int, nombre varchar(50), apellidos varchar(70)); Podemos crear una clave primaria sobre el campo id con esta sentencia:

Page 8: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

ALTER TABLE usuarios MODIFY id INT NOT NULL, ADD PRIMARY KEY(id); Para observar los cambios que hemos hecho, podemos examinar las columnas de la tabla usuarios con una sentencia DESCRIBE: mysql> DESCRIBE usuarios; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | id | int(11) | | PRI | 0 | | | nombre | varchar(50) | YES | | NULL | | | apellidos | varchar(70) | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) El campo id no tiene un valor YES en la columna Null, lo que indica que este campo ya no podrá almacenar valores nulos. Se puede observar también que se tiene un valor PRI en la columna Key, lo que indica que este campo es una clave primaria. Las claves primarias pueden constar de más de un campo. Hay algunas veces en las que un solo campo no puede identificar de manera única a un registro. Í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. CREATE TABLE nombreTabla(campo1 tipoDato, campo2 tipoDato,.. INDEX [nombreIndice] (campo1 [,campo2...])); 2. 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:

Page 9: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

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);

ELIMINAR INDICES

. Cuando hagamos algún cambio en el índice, necesitamos eliminar primero el índice y entonces reconstruirlo con la nueva definición. Para eliminar un índice de clave primaria podemos usar la siguiente sintaxis:

Page 10: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

ALTER TABLE nombreTabla DROP PRIMARY KEY; Para eliminar un índice ordinario, único, o de texto completo, necesitamos especificar el nombre del índice y usar esta sintaxis: ALTER TABLE nombreTabla DROP INDEX nombreIndice; También es válida esta otra sintaxis: DROP INDEX nombreIndice ON nombreTabla; Si no estamos seguros de cuál es el nombre del índice que deseamos eliminar, podemos hacer uso de la sentencia SHOW KEYS: SHOW KEYS FROM nombreTabla; Este es un ejemplo. CREATE TABLE usuarios ( id INT NOT, nombre VARCHAR(50) NOT NULL, apellidos VARCHAR(70) NOT NULL, PRIMARY KEY (id), INDEX (nombre, apellidos) ); Veamos los índices que existen en esta tabla: mysql> SHOW KEYS FROM usuarios; +----------+------------+----------+--------------+-------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | +----------+------------+----------+--------------+-------------+ . | usuarios | 0 | PRIMARY | 1 | id | . | usuarios | 1 | nombre | 1 | nombre | . | usuarios | 1 | nombre | 2 | apellidos | +----------+------------+----------+--------------+-------------+ 3 rows in set (0.00 sec) La tercera columna es la que nos proporciona los nombres de los índices. Podemos observar que al no especificar un nombre al índice ordinario en (nombre, apellidos), se le ha asignado el nombre de la primera columna que forma el índice. A continuación vamos a eliminar los dos índices que existen en esta tabla: mysql> ALTER TABLE usuarios DROP PRIMARY KEY; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE usuarios DROP INDEX nombre; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 Por último, podemos verificar que estos índices ya no existen: mysql> SHOW KEYS FROM usuarios; Empty set (0.00 sec) MODIFICAR

Page 11: Indices en workbench

Universidad Tecnológica del Estado de Zacatecas Unidad Académica de Pinos

Para modificar un indice se puede hacer de la siguiente manera

1 alter table users add index `idx_nick` (`nick_usuario`);

Donde idx_nick es el nombre del indice que estamos creando y nick_usuario el campo

en la tabla que vamos a indexar.

Para añadir un nuevo indice compuesto se puede hacer de la siguiente manera

1 alter table users add index `idx_logins` (`id`, `username`, `status`, `email`)

Esto puede dar lugar a veces a que el tamaño del indice que estamos generando es

demasiado grande.

specified key was too long; max key lenght is 1000 bytes Para ello vamos ajustando el

tamaño que asignamos a cada campo para el indice.

1 alter table users add index `idx_logins` (`id`, `username`(200), `status`, `email`(100))