martes, 30 de octubre de 2012

45 - Creación de índices a tablas existentes (create index)

Podemos agregar un índice a una tabla existente.

Para agregar un índice común a la tabla "libros" tipeamos:

 create index i_editorial on libros (editorial);
 
Entonces, para agregar un índice común a una tabla existente usamos "create index", indicamos el nombre, sobre qué tabla y el o los campos por los cuales se indexará, entre paréntesis.

Para agregar un índice único a la tabla "libros" tipeamos:

 create unique index i_tituloeditorial on libros (titulo,editorial);
 
Para agregar un índice único a una tabla existente usamos "create unique index", indicamos el nombre, sobre qué tabla y entre paréntesis, el o los campos por los cuales se indexará.

Un índice PRIMARY no puede agregarse, se crea automáticamente al definir una clave primaria.


PROBLEMA RESUELTO

Trabajamos con nuestra tabla "libros" de una librería.

Eliminamos la tabla, si existe.

Creamos la tabla con clave primaria:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  primary key (codigo)
 );
 
Veamos la información de los índices:

 show index from libros;
 
Vemos que tenemos el índice creado al definir la clave primaria (PRIMARY).

Para agregar un índice común a la tabla "libros" tipeamos:

 create index i_editorial on libros (editorial);
 
Veamos la información de los índices:

 show index from libros;
 
Aparecen 2, "PRIMARY" y "i_editorial".

Para agregar un índice único a la tabla "libros" tipeamos:

 create unique index i_tituloeditorial on libros (titulo,editorial);
 
Veamos la información de los índices:

 show index from libros;
 
Aparecen 3, "PRIMARY", "i_editorial" y "i_tituloeditorial".


PROBLEMA PROPUESTO

Retome la tabla "clientes" que almacena información sobre los clientes de una 
empresa.

1- Elimine la tabla "clientes", si existe.

2- Créela con esta estructura:
 
  create table clientes (
  documento char (8) not null,
  nombre varchar(30) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  provincia varchar (20),
  telefono varchar(11)
 );

3- Agregue un índice común por ciudad y provincia:
 
4- Vea la información de los índices:

5- Agregue un índice único por el campo "documento":
  
 
Otros problemas: 

Una clínica registra las consultas de los pacientes en una tabla llamada 
"consultas".

1- Elimine la tabla si existe.

2- Cree la tabla con la siguiente estructura:
 
  create table consultas(
  fecha date,
  numero int unsigned,
  documento char(8) not null,
  obrasocial varchar(30),
  medico varchar(30),
 );

3- Agregue un índice único multicampo (fecha,documento,medico):

4- Agregue un índice común por el campo "medico":
 
5- Agregue un índice común por el campo "obrasocial":
 
6- Vea los índices.
 


44 - Borrar indice (drop index)

Para eliminar un índice usamos "drop index".
Ejemplo:

 drop index i_editorial on libros;
 drop index i_tituloeditorial on libros;
 
Se elimina el índice con "drop index" seguido de su nombre y "on" seguido del nombre de la tabla a la cual pertenece.

Podemos eliminar los índices creados con "index" y con "unique" pero no el que se crea al definir una clave primaria. Un índice PRIMARY se elimina automáticamente al eliminar la clave primaria (tema que veremos más adelante).


PROBLEMA RESUELTO

Trabajamos con nuestra tabla "libros" de una librería.

Eliminamos la tabla, si existe.

Creamos dos índices, uno común, por un solo campo y otro único multicolumna:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  primary key (codigo),
  index i_editorial (editorial),
  unique i_tituloeditorial (titulo,editorial)
 );
 
Veamos la información de los índices:

 show index from libros;
 
Vemos que tenemos tres índices, uno creado automáticamente al definir la clave primaria (PRIMARY).

Para eliminar los índices creados con "index" y con "unique" usamos "drop index".

Eliminamos el índice "i_editorial":

 drop index i_editorial on libros;
 
Eliminamos el índice "i_tituloeditorial":

 drop index i_tituloeditorial on libros;
 
Si tipeamos:

 show index from libros;
 
vemos que solamente queda el índice creado al definir la clave primaria. Este tipo de índice no puede borrarse con "drop index".


PROBLEMA PROPUESTO

Un instituto de enseñanza guarda los datos de sus alumnos en una tabla llamada 
"alumnos".

1- Elimine la tabla si existe.

2- Cree la tabla con la siguiente estructura:
 
  create table alumnos(
  año year not null,
  numero int unsigned not null,
  nombre varchar(30),
  documento char(8) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  provincia varchar(20),  
  primary key(año,numero),
  unique i_documento (documento),
  index i_ciudadprovincia (ciudad,provincia),
 );

3- Vea los índices de la tabla.

4- Elimine el índice "i_ciudadprovincia".

5- Verifique la eliminación usando "show index".

6- Intente eliminar el índice PRIMARY.

7- Elimine el índice único.

8- Verifique la eliminación usando "show index".
 
 
Otros problemas: 

Una clínica registra las consultas de los pacientes en una tabla llamada 
"consultas".

1- Elimine la tabla si existe.

2- Cree la tabla con la estructura siguiente:
 
  create table consultas(
  fecha date,
  numero int unsigned,
  documento char(8) not null,
  obrasocial varchar(30),
  medico varchar(30),
  primary key(fecha,numero),
  unique i_consulta(documento,fecha,medico),
  index i_medico (medico),
  index i_obrasocial (obrasocial)
 );

4- Vea los índices.

5- Elimine el índice único.

6- Elimine el índice "i_medico".

7- Verifique las eliminaciones anteriores visualizando los índices.

8- Elimine el índice "i_obrasocial".
 


43 - Indice único (unique)

Veamos el otro tipo de índice, único. Un índice único se crea con "unique", los valores deben ser únicos y diferentes, aparece un mensaje de error si intentamos agregar un registro con un valor ya existente. Permite valores nulos y pueden definirse varios por tabla. Podemos darle un nombre, si no se lo damos, se coloca uno por defecto.

Vamos a trabajar con nuestra tabla "libros".

Crearemos dos índices únicos, uno por un solo campo y otro multicolumna:

  create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  unique i_codigo(codigo),
  unique i_tituloeditorial (titulo,editorial)
 );
 
Luego de la definición de los campos colocamos "unique" seguido del nombre que le damos y entre paréntesis el o los campos por los cuales se indexará dicho índice.

"show index" muestra la estructura de los índices:

 show index from libros;
 
 
PROBLEMA RESUELTO
 
Trabajamos con nuestra tabla "libros" de una librería.

Eliminamos la tabla, si existe.

Crearemos dos índices únicos, uno por un solo campo y otro multicolumna:

create table libros( codigo int unsigned auto_increment, titulo varchar(40) not null, autor varchar(30), editorial varchar(15), unique i_codigo (codigo), unique i_tituloeditorial (titulo,editorial) );

Veamos la información de los índices:

show index from libros;

Analicemos esta información:



Aparecen 3 filas.

La tabla tiene 2 índices (2 filas corresponden al mismo índice).

Ambos índices son únicos, o sea, no permiten valores repetidos, esto se indica en la columna "Non_unique".

La columna "Key_name" indica el nombre de los índices. La columna "Seq_in_index" y "Column_name" muestran la secuencia de la indexación para cada campo del índice "i_tituloeditorial". En el índice "i_tituloeditorial" y el campo "titulo" muestra 1 y para el campo "editorial" muestra 2, esto significa que está indexado en ese orden.

La columna "Null" indica si el campo permite valores nulos; el índice "i_codigo" no los permite; el campo "titulo" del índice "i_tituloeditorial" no los permite (recuerde que lo definimos "not null"), el campo "editorial" si los permite (YES).


PROBLEMA PROPUESTO

Un instituto de enseñanza guarda los siguientes datos de sus alumnos:
 
 - año de inscripción,
 - número de inscripto, comienza desde 1 cada año,
 - nombre del alumno,
 - documento del alumno,
 - domicilio,
 - ciudad,
 - provincia,
 - clave primaria: número de inscripto y año de inscripción.

1- Elimine la tabla "alumnos" si existe.

2- Cree la tabla definiendo una clave primaria compuesta (año de inscripción y número de 
inscripto), un índice único por el campo "documento" y un índice común por ciudad y provincia: 
 
create table alumnos(
  año year not null,
  numero int unsigned not null,
  nombre varchar(30),
  documento char(8) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  provincia varchar(20),  
  primary key(año,numero),
  unique i_documento (documento),
  index i_ciudadprovincia (ciudad,provincia),
 );

3- Vea los índices de la tabla.

4- Ingrese algunos registros. Ingrese 2 ó 4 alumnos para los años 2004, 2005 y 2006.

5- Intente ingresar un alumno con clave primaria repetida.

6- Intente ingresar un alumno con documento repetido.

7- Ingrese varios alumnos de la misma ciudad y provincia.
 
 
Otros problemas: 

A) Una clínica registra las consultas de los pacientes en una tabla llamada "consultas" que 
almacena la siguiente información:
 
 - fecha de la consulta,
 - número de consulta por día,
 - documento del paciente,
 - obra social del paciente,
 - nombre del médico que atiende al paciente,

1- Elimine la tabla si existe.

2- Cree la tabla con una clave primaria compuesta (fecha y número de consulta); un índice único 
(fecha,documento y médico). Hay 2 campos por los cuales podemos realizar consultas 
frecuentemente: "medico" y "obrasocial", cree índices para esos campos.

3- Cree la tabla con la siguiente estructura: 
 
create table consultas(
  fecha date,
  numero int unsigned,
  documento char(8) not null,
  obrasocial varchar(30),
  medico varchar(30),
  primary key(fecha,numero),
  unique i_consulta(documento,fecha,medico),
  index i_medico (medico),
  index i_obrasocial (obrasocial)
 );

4- Vea los índices.

5- Los valores de la clave primaria no pueden repetirse. Intente ingresar dos pacientes el mismo 
día con el mismo número de consulta.

6- Los valores para el índice único no pueden repetirse. Intente ingresar una consulta del mismo 
paciente, en la misma fecha con el mismo médico.

7- Note que los índices por los campos "medico" y "obrasocial" son comunes, porque los valores se 
repiten. Ingrese consultas en las cuales se repitan los médicos y las obras sociales.


B) Una empresa de remises tiene registrada la información de sus vehículos en una tabla 
llamada "remis".

1- Elimine la tabla si existe.

2- Cree la tabla con una clave primaria por número de vehículo y un índice único por "patente", 
éste es un valor por el cual podemos realizar consultas frecuentemente y es único (igual que el 
número del remis):
 
 create table remis(
  patente char(6) not null,
  numero tinyint unsigned not null,
  marca varchar(15),
  modelo year,
  primary key (numero),
  unique i_patente (patente),
 );

3- Vea los índices y analice la información.

4- Los valores de la clave primaria no pueden repetirse. Intente ingresar 2 vehículos con el mismo 
número.

5- Los valores para el índice único no pueden repetirse. Intente ingresar 2 vehículos con igual 
patente.
 

 

42 - Indice común (index)

Dijimos que hay 3 tipos de índices. Hasta ahora solamente conocemos la clave primaria que definimos al momento de crear una tabla.

Vamos a ver el otro tipo de índice, común. Un índice común se crea con "index", los valores no necesariamente son únicos y aceptan valores "null". Puede haber varios por tabla.
Vamos a trabajar con nuestra tabla "libros".

Un campo por el cual realizamos consultas frecuentemente es "editorial", indexar la tabla por ese campo sería útil.

Creamos un índice al momento de crear la tabla:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  primary key(codigo),
  index i_editorial (editorial)
 );
 
Luego de la definición de los campos colocamos "index" seguido del nombre que le damos y entre paréntesis el o los campos por los cuales se indexará dicho índice.

"show index" muestra la estructura de los índices:

 show index from libros;
 
Si no le asignamos un nombre a un índice, por defecto tomará el nombre del primer campo que forma parte del índice, con un sufijo opcional (_2,_3,...) para que sea único.

Ciertas tablas (MyISAM, InnoDB y BDB) soportan índices en campos que permiten valores nulos, otras no, debiendo definirse el campo como "not null".

Se pueden crear índices por varios campos:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  index i_tituloeditorial (titulo,editorial)
 );
 
Para crear índices por múltiple campos se listan los campos dentro de los paréntesis separados con comas.

Los valores de los índices se crean concatenando los valores de los campos mencionados.

Recuerde que "index" es sinónimo de "key".


PROBLEMA RESUELTO

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla, si existe.

Creamos la tabla "libros" con 2 índices:

 - una clave primaria (codigo),
 - un índice común por el campo "editorial",
 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  primary key(codigo),
  index i_editorial (editorial)
 );
 
Analicemos la estructura de los índices:

 show index from libros;
Analicemos esta información:

Table Non_unique Key_name Column_name Null
______________________________________________________________
libros  0 PRIMARY  codigo  
libros  1 i_editorial editorial YES

Vemos que la tabla tiene 2 índices, uno de ellos corresponde a la clave primaria (codigo) que se creó automáticamente al definir el campo "código" como clave primaria; el otro es el que creamos con "index" llamado "i_editorial".

La columna "Table" indica de qué tabla estamos visualizando los índices.

La columna "Non_unique" indica si los valores son "no únicos"; para el índice creado por la clave primaria indica "false" (0), significa que SON únicos, no hay valores repetidos para ese campo (recuerde lo aprendido sobre clave primaria); para el índice "i_editorial" indica "true" (1), es decir, NO son únicos, hay valores repetidos.

La columna "Key_name" muestra el nombre del índice; para el campo correspondiente a la clave primaria tomó el nombre "PRIMARY"; el otro nombre es el que le dimos nosotros al definirlo (i_editorial).

La columna "Column_name" muestra el nombre del campo por el que está ordenado el índice, "codigo" para el índice "PRIMARY" y "editorial" para nuestro índice.

La columna "Null" indica si permite valores nulos; el índice "PRIMARY" no los permite (recuerde lo aprendido sobre clave primaria), el índice "i_editorial" si los permite (aparece YES).

Las demás columnas no serán explicadas por el momento.

Se pueden crear índices por varios campos:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  primary key(codigo),
  index i_tituloeditorial (titulo,editorial)
 );
 
Note que los campos se listan entre paréntesis separados por comas.

Veamos la información de los índices:

 show index from libros;
 
Analicemos esta información:

Table Non_unique Key_name Seq_in_index Column_name Null
____________________________________________________________________________
libros  0 PRIMARY   1 codigo
libros  1 i_tituloeditorial 1 titulo  
libros  1 i_tituloeditorial 2 editorial YES

Aparecen 3 filas.

La tabla tiene 2 índices (2 filas corresponden al mismo índice): uno de ellos corresponde a la clave primaria (codigo) que se creó automáticamente al definir el campo "código" como clave primaria; el otro es el que creamos con "index" llamado "i_tituloeditorial".

El índice "PRIMARY", no tiene valores repetidos (No es "No único"); el índice "i_tituloeditorial" es "No único", o sea, hay valores repetidos.

La columna "Seq_in_index" y "Column_name" muestran la secuencia de la indexación para cada campo. En el índice "i_tituloeditorial" y el campo "titulo" muestra 1 y para el campo "editorial" muestra 2, esto significa que está indexado en ese orden.

La columna "Null" indica si el campo permite valores nulos; el índice "PRIMARY" no los permite; el campo "titulo" del índice "i_tituloeditorial" no los permite (recuerde que lo definimos "not null"), el campo "editorial" si los permite (YES).


PROBLEMA PROPUESTO:



Retome la tabla llamada "medicamentos" de una farmacia.

1- Elimine la tabla, si existe.

2- Cree la tabla e indéxela por el campo "laboratorio":
 
 create table medicamentos(
  codigo int unsigned auto_increment,
  nombre varchar(20) not null,
  laboratorio varchar(20),
  precio decimal (6,2) unsigned,
  cantidad int unsigned,
  primary key(codigo),
  index i_laboratorio (laboratorio)
 );

3- Visualice los índices de la tabla "medicamentos" y analice la información:
  
 
Otros problemas: 
A) Retomamos la tabla "clientes" de una empresa.

1- Elimine la tabla "clientes", si existe.

2- Créela y defina un índice por múltiples campos, por ciudad y provincia: 
 
  create table clientes (
  documento char (8) not null,
  nombre varchar(30) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  provincia varchar (20),
  telefono varchar(11),
  primary key (codigo), 
  index i_ciudadprovincia (ciudad,provincia)
 );

3- Muestre los índices:
 

4- Analice la información:
Aparecen 3 filas, 3 índices. Uno de ellos corresponde a la clave primaria (PRIMARY), es único (los 
valores no se repiten) y no acepta valores nulos. Otro índice, llamado "i_ciudadprovincia", es No 
único, es decir, acepta valores repetidos, consta de 2 campos, el orden es "ciudad" y "provincia" y 
acepta valores nulos (ambos campos).


B) Trabaje con la tabla "agenda" que registra la información referente a sus amigos.

1- Elimine la tabla si existe.

2- Cree la tabla con la siguiente estructura:
 
 create table agenda(
  apellido varchar(30),
  nombre varchar(20) not null,
  domicilio varchar(30),
  telefono varchar(11),
  mail varchar(30),
  index i_apellido (apellido)
 );

3- Ingrese los siguientes registros:
 
 insert into agenda values('Perez','Juan','Sarmiento 345','4334455','juancito@gmail.com');
 insert into agenda values('Garcia','Ana','Urquiza 367','4226677','anamariagarcia@hotmail.com');
 insert into agenda values('Lopez','Juan','Avellaneda 900',null,'juancitoLopez@gmail.com');
 insert into agenda values('Juarez','Mariana','Sucre 123','0525657687','marianaJuarez2@gmail.com');
 insert into agenda values('Molinari','Lucia','Peru 1254','4590987','molinarilucia@hotmail.com');
 insert into agenda values('Ferreyra','Patricia','Colon 1534','4585858',null);
 insert into agenda values('Perez','Susana','San Martin 333',null,null);
 insert into agenda values('Perez','Luis','Urquiza 
444','0354545256','perezluisalberto@hotmail.com');
 insert into agenda values('Lopez','Maria','Salta 314',null,'lopezmariayo@gmail.com');

4- Vea la información de los índices:
 
5- Analice la información.
 

41 - Indice de tipo primary.

El índice llamado primary se crea automáticamente cuando establecemos un campo como clave primaria, no podemos crearlo directamente. El campo por el cual se indexa puede ser de tipo numérico o de tipo caracter.

Los valores indexados deben ser únicos y además no pueden ser nulos. Una tabla solamente puede tener una clave primaria por lo tanto, solamente tiene un índice PRIMARY.

Puede ser multicolumna, es decir, pueden estar formados por más de 1 campo.

Veamos un ejemplo definiendo la tabla "libros" con una clave primaria:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  primary key(codigo)
 );
 
Podemos ver la estructura de los índices de una tabla con "show index". Por ejemplo:

 show index from libros;
 
Aparece el índice PRIMARY creado automáticamente al definir el campo "codigo" como clave primaria.


PROBLEMA RESUELTO

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla si existe.

Creamos la tabla definiendo el campo "codigo" como clave primaria:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30),
  editorial varchar(15),
  primary key(codigo)
 );
 
Veamos la estructura de los índices de la tabla:

 show index from libros;
 
Muestra la siguiente información:

Table Non_unique Key_name Column_name Null
______________________________________________________________
libros  0 PRIMARY  codigo

Aparece el índice PRIMARY creado automáticamente al definir el campo "codigo" como clave primaria.

La columna "Table" indica a qué tabla pertenece el índice. La columna "Non_unique" indica si los valores del índice son No únicos, es decir, si hay valores repetidos para ese campo, aquí indica "0" (false), o sea, los valores son únicos. La columna "Key_name" muestra el nombre del índice. La columna "Column_name" muestra el campo indexado y la columna "Null" señala si el campo indexado permite valores nulos, cuando los permite aparace "YES", aquí no, así que no los permite.


PROBLEMA PROPUESTO

Una empresa almacena los datos de sus clientes en una tabla llamada "clientes".

1- Elimine la tabla "clientes" si existe.

2- Créela con los siguientes campos y clave:
 
 create table clientes(
  documento char(8),
  apellido varchar(20),
  nombre varchar(20),
  domicilio varchar(30),
  primary key(documento)
 );

3- Vea la estructura de los índices la tabla y analice la información:
 
 
Otros problemas: 
Un instituto de enseñanza almacena los datos de sus estudiantes en una tabla llamada "alumnos".

1- Elimine la tabla "alumnos" si existe.

2- Cree la tabla con la siguiente estructura:
 
  create table alumnos(
  legajo varchar(4) not null,
  documento char(8) not null,
  apellido varchar(30),
  nombre varchar(30),
  domicilio varchar(30),
  primary key (legajo)
 );

3- Vea la estructura de los índices la tabla y analice la información:

 

40 - Indice de una tabla.

Para facilitar la obtención de información de una tabla se utilizan índices.

El indice de una tabla desempeña la misma función que el índice de un libro: permite encontrar datos rápidamente; en el caso de las tablas, localiza registros.

Una tabla se indexa por un campo (o varios).

El índice es un tipo de archivo con 2 entradas: un dato (un valor de algún campo de la tabla) y un puntero.

Un índice posibilita el acceso directo y rápido haciendo más eficiente las búsquedas. Sin índice, se debe recorrer secuencialmente toda la tabla para encontrar un registro.

El objetivo de un indice es acelerar la recuperación de información.

La desventaja es que consume espacio en el disco.

La indexación es una técnica que optimiza el acceso a los datos, mejora el rendimiento acelerando las consultas y otras operaciones. Es útil cuando la tabla contiene miles de registros.

Los índices se usan para varias operaciones:

- para buscar registros rápidamente.
- para recuperar registros de otras tablas empleando "join".

Es importante identificar el o los campos por los que sería útil crear un indice, aquellos campos por los cuales se realizan operaciones de búsqueda con frecuencia.

Hay distintos tipos de índices, a saber:

1) "primary key": es el que definimos como clave primaria. Los valores indexados deben ser únicos y además no pueden ser nulos. MySQL le da el nombre "PRIMARY". Una tabla solamente puede tener una clave primaria.

2) "index": crea un indice común, los valores no necesariamente son unicos y aceptan valores "null". Podemos darle un nombre, si no se lo damos, se coloca uno por defecto. "key" es sinónimo de "index". Puede haber varios por tabla.

3) "unique": crea un indice para los cuales los valores deben ser únicos y diferentes, aparece un mensaje de error si intentamos agregar un registro con un valor ya existente. Permite valores nulos y pueden definirse varios por tabla. Podemos darle un nombre, si no se lo damos, se coloca uno por defecto.

Todos los índices pueden ser multicolumna, es decir, pueden estar formados por más de 1 campo.
En las siguientes lecciones aprenderemos sobre cada uno de ellos.

Una tabla puede tener hasta 64 índices. Los nombres de índices aceptan todos los caracteres y pueden tener una longitud máxima de 64 caracteres. Pueden comenzar con un dígito, pero no pueden tener sólo dígitos.

Una tabla puede ser indexada por campos de tipo numérico o de tipo caracter. También se puede indexar por un campo que contenga valores NULL, excepto los PRIMARY.

"show index" muestra información sobre los índices de una tabla. Por ejemplo:

 show index from libros;