Foros del Web » Programando para Internet » PHP »

debo agregar indices?

Estas en el tema de debo agregar indices? en el foro de PHP en Foros del Web. Bueno, como es de costumbre, en el foro de bds no me contestan, y aprovecha para de paso hacer una nueva pregunta aca. Es importante ...
  #1 (permalink)  
Antiguo 16/05/2003, 01:23
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 9 meses
Puntos: 0
debo agregar indices?

Bueno, como es de costumbre, en el foro de bds no me contestan, y aprovecha para de paso hacer una nueva pregunta aca.
Es importante auqel mensaje:
http://www.forosdelweb.com/showthrea...hreadid=130741

Y ahora:
La gente del server me dijo que la demora se daba porque no tenia creados indices en mis tablas, que al menos deberia crearlos para las fechas.
Uno de los tecnicos creo uno asi: KEY ultima_accion (ultima_accion,id) (ultima_accion es fecha)
Luego de esto, las busquedas que implicaban a este campo mejoraron mucho, realmente se nota tanto en local como en servidor. Pero tengo mas campos de fechas que me alentizan las busquedas, no solo es ese. Y el tecnico me dijo que tampoco era bueno agregar demasiados indices. Claro que no me va a explicar el porque, eso ya es otro precio. Por eso estoy aca

Pero juro que busque por todos lados info sobre esto, y de la que encontre no entendi nada. Se mas o menos que es un indice (igualmente si alguien pudiera explicarmelo, mejor), pero usando el mysql-front comprobe que uno puede agregar indices de uno o mas campos por separado, o un indice con muchos campos. Cual es la diferencia, que es lo que deberia hacer?

Please, ayudenme con esto, para mi es algo completamente nuevo.
  #2 (permalink)  
Antiguo 16/05/2003, 04:08
Avatar de sci-fi  
Fecha de Ingreso: marzo-2002
Mensajes: 157
Antigüedad: 22 años
Puntos: 0
hola,

andaba en eso también estos días... y la verdad que no pude encontrar, al menos hasta el momento, ningún material que explicara claramente y desde cero qué son los índices y cómo mejor usarlos.

Pero de lo que encontré, saqué en claro esto: los índices serían como un índice de los que hay en los libros. El índice de los capítulos, o el índice de determinadas palabras (creo que esto se llama 'glosario', donde aparecen determinadas palabras y el número de páginas donde son mencionadas en el libro).

Entonces, cuando uno necesita buscar el libro, sobre determinado tema, supongamos 'pelícanos': en lugar de leer todo el libro desde cero buscando esa parte donde se hablaba de pelícanos, uno va directamente al índice o glosario y busca pelícano en la leta P; ahí figura el número de página/s donde aparece, y va directamente ahí. Lo mismo haría la base de datos: en lugar de relevar *toda* la tabla en busca de determinado registro, va al índice que pueda usar para ese campo que tiene que buscar, y se fija ahí antes en lugar de buscar *toda* la tabla...

La idea es que te conviene usar índices en aquéllos campos *más usados* de la tabla, por ejemplo para JOINs, o WHEREs. La clave única no es problema, esa siempre se define para campos del tipo ID. Pero después se puede definir un índice no-único combinando campos. Por ej. supongamos que hay una tabla clientes. ID es la clave principal. Pero si usas muchas consultas utilizando el nombre de los clientes, te convendría crear un índice que combine el campo ID más el campo que contiene el nombre del cliente. También si utilizas muchos JOINs con otras tablas, por ejemplo una tabla 'productos', que utilice frecuentemente JOIN's con la tabla de clientes, para esos JOINs vas a tener, usualmente, determinados campos que más utilices: un campo ID, el mismo campo que contenga el nombre.

bueno ya se me hizo muy largo...

de todas maneras, podes usar la clausula EXPLAIN (creo que esto es específico de MySQL). Por ejemplo, para un consulta 'SELECT clientes.id, clientes.id_producto, productos.fecha_compra FROM clientes INNER JOIN productos ON productos.id = clientes.id_producto". Si se hace

EXPLAIN SELECT clientes.id, clientes.id_producto, productos.fecha_compra FROM clientes INNER JOIN productos ON productos.id = clientes.id_producto,

MySQL te va devolver unos campos temporales que explican si utilizaría posibles índices (y el nombre de los indices), si relevaría todos los campos de la tabla o no, etc...

saludos
__________________
webdeveloper
http://www.javascripters.com.ar/
diseño web y tecnología
  #3 (permalink)  
Antiguo 16/05/2003, 11:23
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 9 meses
Puntos: 0
Cita:
de todas maneras, podes usar la clausula EXPLAIN (creo que esto es específico de MySQL). Por ejemplo, para un consulta 'SELECT clientes.id, clientes.id_producto, productos.fecha_compra FROM clientes INNER JOIN productos ON productos.id = clientes.id_producto". Si se hace

EXPLAIN SELECT clientes.id, clientes.id_producto, productos.fecha_compra FROM clientes INNER JOIN productos ON productos.id = clientes.id_producto,
Inteersante, pero no estoy muy avanzado en mysql. Es mas, seguramente mis consultas son un desastre, poque no se para que sirve lo del join, inner, ni nada.
Te podrias tomar la molestia de explicarmelo?

Muchisimas gracias!
  #4 (permalink)  
Antiguo 16/05/2003, 14:50
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

Mas o menos el tema de los indices es como explica sci-fi. En teoria, para acelerar tus select, deberias crear un indice con cada convinacion de campos que uses el la condicion where ( o en order by). Por ejemplo, si usas las siguientes condiciones:

where nombre=' lo que sea'
where nombre='lo que sea' and dni='otra cosa'
where nombre='lo que sea' and dni='otra cosa' and fecha='otra mas'

tendrias que crear 3 indices:

indice_1 (nombre)
indice_2 (nombre,dni)
indice_3 (nombre,dni,fecha)

Esto seria lo ideal si esta rapidez no tuviera un coste. Cada indice que crees hay que mantenerlo. Cada indice genera un fichero de indices. Cada vez que añadas, borres o modifiques un registro, hay que recalcular todos los indices. Ocupan espacio. Si tienes muchos registros puede tardar en reconstruirse, pudiendo enlentecer las consultas a BD.

Mi consejo, crea como maximo 3 indeces, ademas de la clave primaria.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 16/05/2003, 15:30
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 9 meses
Puntos: 0
Muchas gracias Josemi, ya me esta quedando mas claro.
Te hago una pregunta mas: que pasa si creo tres indices como por ejemplo:

indice_1 (nombre)
indice_2 (nombre,dni)
indice_3 (nombre,dni,fecha)

Si luego de esto hago una consulta del tipo
WHERE fecha=esto AND nombre=lootro

Esta consulta se ve favorecida?

Y si metiera otro campo?
WHERE otrafecha=esto AND nombre=lootro

Aca que pasaria?
  #6 (permalink)  
Antiguo 16/05/2003, 15:53
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Bueno, si no tienes problemas con el ingles, aqui tienes como usa MySQL los indices: http://www.mysql.com/doc/en/MySQL_indexes.html

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 16/05/2003, 22:22
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 9 meses
Puntos: 0
Si, tengo muchos problemas con el ingles . Es mas, se me habia ocurrido una nueva pregunta para hacerte. Pero bueno, gracias de todos modos.

Josemi: cuando me pasaste ese link me dije "estoy muerto, que voy a hacer sin ayuda".
Pero te lo super agradezco, lo "lei", lo entendi casi todo, y ahora entiendo bastante bien como es el tema de los indices, e hice varias pruebas en local con muy buenos resultados!

Última edición por zeus_bsas; 16/05/2003 a las 22:22
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:03.