Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Uso de indices

Estas en el tema de Uso de indices en el foro de Bases de Datos General en Foros del Web. Buenas! tengo una duda respecto a como usar indices en mi base de datos, y me gustaria escuchar opiniones y consejos de gente que sepa ...
  #1 (permalink)  
Antiguo 22/03/2011, 06:34
 
Fecha de Ingreso: marzo-2011
Mensajes: 4
Antigüedad: 13 años, 8 meses
Puntos: 0
Pregunta Uso de indices

Buenas!

tengo una duda respecto a como usar indices en mi base de datos, y me gustaria escuchar opiniones y consejos de gente que sepa sobre el tema. Os comento.

Tengo las siguientes tablas:

Tabla: Peticion

Columnas:

* Id

* Tipo_peticion_id

* Nombre_usuario

* Ciudad_usuario

* Fecha_peticion

Tabla: Contenido

* Id

* Peticion_id

* Sub_id1

* Sub_id2

* Texto

Pongo un ejemplo de como se verian los datos:

Código:
---Peticion---

--id--  --tipo peticion id-- --nombre usuario-- --ciudad usuario-- --fecha peticion--
  12          100                Javier               Sevilla          18-12-2010
  13          100                Marcos               Madrid           27-01-2011

---Contenido---

--id-- --peticion id-- --subid1-- --subid2--  --texto--
  40        12            1            1         blabla
  41        13            1            1          test
Bien, pues teniendo 8000 registros en cada tabla (uno para el usuario y la fecha de peticion, y el otro en la otra tabla para el contenido de esta), al hacer el siguiente query :

select peticion.id, contenido.texto from peticion, contenido where peticion.id=contenido.peticion_id and peticion.tipo_peticion_id=100 and contenido.subid1=1 and contenido.subid2=1 order by peticion.id desc

me tarda unos 40 segundos en darme el resultado. Se que son muchos registros, pero querria que me tardara algo menos si es posible, asi que me puse a investigar y encontre que mediante indices se puede reducir el tiempo de obtencion de los datos. A esto, ahi va mi pregunta. Donde seria mas correcto poner los indices? En los ids? En las columnas que se usan en las condiciones para obtener la query? (tipo peticion id, subid1, subid2)

Si alguien domina sobre el tema le estaria muy agradecido que diera su opinion al respecto : )

Gracias de antemano!
  #2 (permalink)  
Antiguo 22/03/2011, 07:14
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Uso de indices

Antes que meterte a crear indices (que esta bien la idea) deberías optimizar la consulta que haces y utilizar un INNER JOIN para unir las tablas.

Código SQL:
Ver original
  1. SELECT peticion.id, contenido.texto
  2. FROM peticion p
  3. INNER JOIN contenido c ON
  4. p.id=c.peticion_id
  5. WHERE p.tipo_peticion_id=100
  6. AND c.subid1=1
  7. AND c.subid2=1
  8. ORDER BY p.id DESC
  #3 (permalink)  
Antiguo 22/03/2011, 20:42
 
Fecha de Ingreso: marzo-2011
Mensajes: 4
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Uso de indices

Gracias por contestar ^^

Creia que la diferencia entre un inner join implicito y explicito eran minimas. De todos modos lo he cambiado y me sigue tardando casi el mismo tiempo que de forma implicita...

Respecto a los indices, segun lo que he leido he llegado a la siguiente conclusion:

1. Siempre es mejor poner los indices en columnas que sean enteros pq ocupan menos espacio y en consecuencia aumentan la velocidad del query.

2. En caso de crear un indice que cubra varias columnas, siempre es mejor que estas esten en el orden de menor cardinalidad a mayor.
Cardinalidad hace referencia al posible numero de valores que puede tener una columna en particular.

3. Procurar que las columnas esten declaradas como not null, para que el indice ocupe menos y en consecuencia la busqueda sea mas rapida.

Con esto, veo que lo mejor seria poner los indices en las columnas tipo_peticion_id, subid1 y subid2, ya que son enteros y tienen una cardinalidad muy baja (entre 2 y 5 posibles valores). Tambien las tengo como not null.

Alguien que quiera comentar algo al respecto? : )

Gracias!

Última edición por Krohn; 22/03/2011 a las 23:25
  #4 (permalink)  
Antiguo 23/03/2011, 05:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Uso de indices

Cita:
1. Siempre es mejor poner los indices en columnas que sean enteros pq ocupan menos espacio y en consecuencia aumentan la velocidad del query.

2. En caso de crear un indice que cubra varias columnas, siempre es mejor que estas esten en el orden de menor cardinalidad a mayor.
Cardinalidad hace referencia al posible numero de valores que puede tener una columna en particular.

3. Procurar que las columnas esten declaradas como not null, para que el indice ocupe menos y en consecuencia la busqueda sea mas rapida.
1) Si, es cierto, los índices basados en columnas numéricas son más rápidos, pero eso no implica que sean funcionales para las consultas que necesites hacer. Los índices deben hacerse sobre las columnas que afectan la búsqueda, no porque si, o siguiendo al pie de la letra una "regla" estandarizada.
Como ejemplo, hace unos días tenía que procesar 30.000.000 de registros indexados por su PK numérica, y básicamente usaba la PK para realizar la vinculación. Pero tardaba más de 10 minutos en devolverme los 350.000 registros que cumplian con lo que necesitaba.
Implementé un índice de tipo INDEX sobre tres columnas, dos VARCHAR y una DATETIME, ninguna de las cuales tenía alta selectividad, y el descenso de tiempo hizo que la respuesta tardase 22,47 segundos...
Moraleja: Lo que sirve en todos los casos, no necesariamente sirve en tu caso.

2) Es relativo. Como dije, el tema no es seguir una regla. Poner las columnas de alta selectividad en un índice de múltiples columnas no reduce la cantidad de entradas al índice, porque las mismas se crean en base a la clave completa y no a parte de ella.
Si la primera de tres claves tiene 100 variaciones de valores en su tabla, la segunda 1500 y la tercera 10.000, el primer valor aparecerá de todos modos en 1.500.000.000 de entradas de índice. Su cardianlidad no reduce ni la cantidad de entradas del índice ni la cantidad de bloques a leer de esa clave.

3) Una columna definida en tabla como NOT NULL , usada en un índice no reduce la cantidad de entradas al índice por sí misma. Reduce las entradas porque no puedes ingresar un valor nuevo a la tabla que sea NULL en esos campos, y por tanto hay una entrada menos en el índice en ese caso.
Pero el índice tendrá la misma cantidad de entradas si son NULL que si son NOT NULL. la única diferencia sería que la rama donde el valor de ese campo sea NULL será más larga que en el resto, y por tanto si la incidencia de NULLs en ese campo es alta en la tabla, puede que la performance de ese indice base, pero sólo en el caso de los NULL de esa columna.

Resumiendo:
- No generes índices porque sí. Cuando generas uno estás afectando la performance de las inserciones/actualizaciones negativamente (todo índice debe ser actualizado cuando un valor usado en clave cambia o se inserta).
- Genera los índices especialmente para aquellas consultas que sean críticas en su performance, y presta atención especial a las que manejan cantidades masivas de registros.
- Los indices declarados sobre los mismos campos que se consultan el el SELECT suelen hacer más rápidas las consultas, porque MySQL lee el índice directamente y nunca lee la tabla si todos los valores están allí.
- El uso de índices mejora si en el WHERE las condiciones son "=", y no si son ">", "<", o "LIKE". Estas son de baja performance.
- Los agrupamientos y ordenaciones son pésimos para la performance. ´Susalos sólo cuando sea necesario.
- Aprovecha las tablas temporales y las derivadas (subconsultas) para hacer preselecciones que mejoren la performance.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 23/03/2011, 19:17
 
Fecha de Ingreso: marzo-2011
Mensajes: 4
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Uso de indices

Buenas gnzsoloyo, muchas gracias por tu respuesta, me ha aclarado muchas dudas que tenia al respecto.

De todos modos, en el apartado uno, es obvio que solo se aplicara a las columnas que afecten a la busqueda, tal y como aplico en mi ejemplo. Son solo unas pautas a tener en cuenta a la hora de elegir los indices, como bien dices.

Saludos!

Etiquetas: indices, bases-de-datos
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 23:13.