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

[SOLUCIONADO] Cómo indexar la base de datos

Estas en el tema de Cómo indexar la base de datos en el foro de Mysql en Foros del Web. Buenas, Me encuentro que las consultas que hago a la base de datos son muy lentas. No sé como afrontar el problema y me gustaría ...
  #1 (permalink)  
Antiguo 30/09/2014, 05:42
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Cómo indexar la base de datos

Buenas,
Me encuentro que las consultas que hago a la base de datos son muy lentas.
No sé como afrontar el problema y me gustaría saber vuestra opinión.
En primer lugar decir que se trata de una pequeña base de datos para mostrar unos resultados en una web.
Está compuesta por unas 14 tablas. 13 de ellas son muy pequeñas, contienen 3 o 4 campos con un máximo de 600 registros. Y la otra, tiene 30 campos y unos 800 registros.
Creo que por el tamaño de la base de datos el acceso debería de ser más rápido.

Me preguntaba si añadiendo índices a la base de datos podría obtener más velocidad.
Cuál es la vuestra opinión? Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #2 (permalink)  
Antiguo 30/09/2014, 06:24
 
Fecha de Ingreso: julio-2013
Mensajes: 87
Antigüedad: 10 años, 9 meses
Puntos: 9
Respuesta: Cómo indexar la base de datos

Hola buenas,

Lo primero que creo que deberías hacer es darnos la estructura de tablas y las SQL que estás lanzando. Si haces un EXPLAIN SELECT .... obtendrás información muy valiosa que nos la puedes reenviar para que te ayudemos.

Con esas tablas tan pequeñas el problema es fijo de índices.

Saludos.
  #3 (permalink)  
Antiguo 30/09/2014, 06:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo indexar la base de datos

Los índices no se agregan a la base de datos sino a las tablas, aclaremos. Y no necesariamente te darán rapidez.
Como ya te han dicho, sin ver qué consultas haces, no podemos saber a priori por que son lentas.
Puede deberse a muchas causas.

Postea algunas que te resulten especialmente lentas y veremos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 30/09/2014, 15:27
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Buenas,
Aclaro, cometí error a la hora de exponer el tema. Los índices se añaden a las tablas, no a las bases de datos.
Código MySQL:
Ver original
  1. SELECT un.*, es.titulo, es.descripcion, po.nombre_poblacion, ti.nombre_tipo_ca,
  2. op.operacion_tipo_ca FROM t_un as un, t_ca as es, t_poblacion as po, t_tipo as ti, t_operacion as op
  3. WHERE un.id_piso = es.id_piso AND un.poblacion = po.id_poblacion AND un.tipo = ti.id_tipo AND
  4. un.operacion = op.id_operacion AND un.referencia IN ((SELECT first FROM t_destacados WHERE id_cat='3'),
  5. (SELECT second FROM t_destacados WHERE id_cat='3'), (SELECT third FROM t_destacados WHERE
  6. id_cat='3'), (SELECT forth FROM t_destacados WHERE id_cat='3'), (SELECT fifth FROM t_destacados WHERE
  7. id_cat='3'), (SELECT sixth FROM t_destacados WHERE id_cat='3')) LIMIT 0, 6

Código MySQL:
Ver original
  1. SELECT un.*, po.nombre_poblacion, ti.nombre_tipo_ca, op.operacion_tipo_ca FROM
  2. t_un as un, t_poblacion as po, t_tipo as ti, t_operacion as op, t_familia AS fm WHERE un.poblacion =
  3. po.id_poblacion AND un.tipo = ti.id_tipo AND un.operacion = op.id_operacion AND un.operacion = 4 AND
  4. un.operacion = fm.id_familia AND un.familia = 3 AND ti.id_tipo = '3' ORDER BY un.id_piso DESC

Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no

Última edición por gnzsoloyo; 30/09/2014 a las 17:01
  #5 (permalink)  
Antiguo 30/09/2014, 15:31
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Y la estructura de la base de datos es esta. No conozco otra manera de obtener la estructura que no sea con mysqldump:

Código MySQL:
Ver original
  1. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  2. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  3. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  4. /*!40101 SET NAMES utf8 */;
  5. /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
  6. /*!40103 SET TIME_ZONE='+00:00' */;
  7. /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
  8. /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  9. /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
  10. /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
  11.  
  12. --
  13. -- Table structure for table `t_administradores`
  14. --
  15.  
  16. DROP TABLE IF EXISTS `t_administradores`;
  17. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  18. /*!40101 SET character_set_client = utf8 */;
  19. CREATE TABLE `t_administradores` (
  20.   `user` varchar(20) NOT NULL,
  21.   `pass` varchar(20) NOT NULL,
  22.   PRIMARY KEY (`id`),
  23.   KEY `pass` (`pass`),
  24.   KEY `user` (`user`),
  25.   KEY `pass_2` (`pass`),
  26.   KEY `id` (`id`),
  27.   KEY `user_2` (`user`),
  28.   KEY `id_2` (`id`),
  29.   KEY `user_3` (`user`),
  30.   KEY `pass_3` (`pass`),
  31.   KEY `id_3` (`id`)
  32. /*!40101 SET character_set_client = @saved_cs_client */;
  33.  
  34. --
  35. -- Table structure for table `t_ca`
  36. --
  37.  
  38. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  39. /*!40101 SET character_set_client = utf8 */;
  40. CREATE TABLE `t_ca` (
  41.   `id` int(11) NOT NULL AUTO_INCREMENT,
  42.   `id_piso` varchar(25) DEFAULT NULL,
  43.   `titulo` varchar(255) DEFAULT NULL,
  44.   `descripcion` text,
  45.   PRIMARY KEY (`id`)
  46. ) ENGINE=MyISAM AUTO_INCREMENT=498936 DEFAULT CHARSET=latin1;
  47. /*!40101 SET character_set_client = @saved_cs_client */;
  48.  
  49. --
  50. -- Table structure for table `t_de`
  51. --
  52.  
  53. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  54. /*!40101 SET character_set_client = utf8 */;
  55. CREATE TABLE `t_de` (
  56.   `id` int(11) NOT NULL AUTO_INCREMENT,
  57.   `id_piso` varchar(25) DEFAULT NULL,
  58.   `titulo` varchar(255) DEFAULT NULL,
  59.   `descripcion` text,
  60.   PRIMARY KEY (`id`)
  61. ) ENGINE=MyISAM AUTO_INCREMENT=498115 DEFAULT CHARSET=latin1;
  62. /*!40101 SET character_set_client = @saved_cs_client */;
  63.  
  64. --
  65. -- Table structure for table `t_destacados`
  66. --
  67.  
  68. DROP TABLE IF EXISTS `t_destacados`;
  69. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  70. /*!40101 SET character_set_client = utf8 */;
  71. CREATE TABLE `t_destacados` (
  72.   `id_cat` int(1) NOT NULL,
  73.   `first` varchar(5) NOT NULL,
  74.   `second` varchar(5) NOT NULL,
  75.   `third` varchar(5) NOT NULL,
  76.   `forth` varchar(5) NOT NULL,
  77.   `fifth` varchar(5) NOT NULL,
  78.   `sixth` varchar(5) NOT NULL,
  79.   PRIMARY KEY (`id_cat`)
  80. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  81. /*!40101 SET character_set_client = @saved_cs_client */;
  82.  
  83. --
  84. -- Table structure for table `t_en`
  85. --
  86.  
  87. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  88. /*!40101 SET character_set_client = utf8 */;
  89. CREATE TABLE `t_en` (
  90.   `id` int(11) NOT NULL AUTO_INCREMENT,
  91.   `id_piso` varchar(25) DEFAULT NULL,
  92.   `titulo` varchar(255) DEFAULT NULL,
  93.   `descripcion` text,
  94.   PRIMARY KEY (`id`)
  95. ) ENGINE=MyISAM AUTO_INCREMENT=485708 DEFAULT CHARSET=latin1;
  96. /*!40101 SET character_set_client = @saved_cs_client */;
  97.  
  98. --
  99. -- Table structure for table `t_es`
  100. --
  101.  
  102. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  103. /*!40101 SET character_set_client = utf8 */;
  104. CREATE TABLE `t_es` (
  105.   `id` int(11) NOT NULL AUTO_INCREMENT,
  106.   `id_piso` varchar(25) DEFAULT NULL,
  107.   `titulo` varchar(255) DEFAULT NULL,
  108.   `descripcion` text,
  109.   PRIMARY KEY (`id`)
  110. ) ENGINE=MyISAM AUTO_INCREMENT=377500 DEFAULT CHARSET=latin1;
  111. /*!40101 SET character_set_client = @saved_cs_client */;
  112.  
  113. --
  114. -- Table structure for table `t_familia`
  115. --
  116.  
  117. DROP TABLE IF EXISTS `t_familia`;
  118. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  119. /*!40101 SET character_set_client = utf8 */;
  120. CREATE TABLE `t_familia` (
  121.   `id` int(11) NOT NULL AUTO_INCREMENT,
  122.   `id_familia` varchar(255) DEFAULT NULL,
  123.   `tot_venda` int(11) DEFAULT NULL,
  124.   `tot_lloguer` int(11) DEFAULT NULL,
  125.   `nombre` varchar(255) DEFAULT NULL,
  126.   `nombre_familia_es` varchar(255) DEFAULT NULL,
  127.   `nombre_familia_ca` varchar(255) DEFAULT NULL,
  128.   `nombre_familia_fr` varchar(255) DEFAULT NULL,
  129.   `nombre_familia_en` varchar(255) DEFAULT NULL,
  130.   `nombre_familia_de` varchar(255) DEFAULT NULL,
  131.   PRIMARY KEY (`id`)
  132. ) ENGINE=MyISAM AUTO_INCREMENT=6870 DEFAULT CHARSET=latin1;
  133. /*!40101 SET character_set_client = @saved_cs_client */;
  134.  
  135. --
  136. -- Table structure for table `t_fr`
  137. --
  138.  
  139. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  140. /*!40101 SET character_set_client = utf8 */;
  141. CREATE TABLE `t_fr` (
  142.   `id` int(11) NOT NULL AUTO_INCREMENT,
  143.   `id_piso` varchar(25) DEFAULT NULL,
  144.   `titulo` varchar(255) DEFAULT NULL,
  145.   `descripcion` text,
  146.   PRIMARY KEY (`id`)
  147. ) ENGINE=MyISAM AUTO_INCREMENT=498120 DEFAULT CHARSET=latin1;
  148. /*!40101 SET character_set_client = @saved_cs_client */;
  149.  
  150. --
  151. -- Table structure for table `t_operacion`
  152. --
  153.  
  154. DROP TABLE IF EXISTS `t_operacion`;
  155. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  156. /*!40101 SET character_set_client = utf8 */;
  157. CREATE TABLE `t_operacion` (
  158.   `id` int(11) NOT NULL AUTO_INCREMENT,
  159.   `id_operacion` varchar(255) DEFAULT NULL,
  160.   `operacion_tipo_es` varchar(255) DEFAULT NULL,
  161.   `operacion_tipo_ca` varchar(255) DEFAULT NULL,
  162.   `operacion_tipo_fr` varchar(255) DEFAULT NULL,
  163.   `operacion_tipo_en` varchar(255) DEFAULT NULL,
  164.   `operacion_tipo_de` varchar(255) DEFAULT NULL,
  165.   PRIMARY KEY (`id`)
  166. ) ENGINE=MyISAM AUTO_INCREMENT=2481 DEFAULT CHARSET=latin1;
  167. /*!40101 SET character_set_client = @saved_cs_client */;
  168.  
  169. --
  170. -- Table structure for table `t_poblacion`
  171. --
  172.  
  173. DROP TABLE IF EXISTS `t_poblacion`;
  174. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  175. /*!40101 SET character_set_client = utf8 */;
  176. CREATE TABLE `t_poblacion` (
  177.   `id` int(11) NOT NULL AUTO_INCREMENT,
  178.   `id_poblacion` varchar(255) DEFAULT NULL,
  179.   `nombre_poblacion` varchar(255) DEFAULT NULL,
  180.   `id_provincia` varchar(255) DEFAULT NULL,
  181.   PRIMARY KEY (`id`)
  182. ) ENGINE=MyISAM AUTO_INCREMENT=28634 DEFAULT CHARSET=latin1;
  183. /*!40101 SET character_set_client = @saved_cs_client */;
  184.  
  185. --
  186. -- Table structure for table `t_servei`
  187. --
  188.  
  189. DROP TABLE IF EXISTS `t_servei`;
  190. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  191. /*!40101 SET character_set_client = utf8 */;
  192. CREATE TABLE `t_servei` (
  193.   `id` int(11) NOT NULL AUTO_INCREMENT,
  194.   `titulo_es` varchar(255) DEFAULT NULL,
  195.   `titulo_ca` varchar(255) DEFAULT NULL,
  196.   `titulo_fr` varchar(255) DEFAULT NULL,
  197.   `titulo_en` varchar(255) DEFAULT NULL,
  198.   `titulo_de` varchar(255) DEFAULT NULL,
  199.   `descripcion_es` text,
  200.   `descripcion_ca` text,
  201.   `descripcion_fr` text,
  202.   `descripcion_en` text,
  203.   `descripcion_de` text,
  204.   `orden` int(11) DEFAULT '0',
  205.   PRIMARY KEY (`id`)
  206. ) ENGINE=MyISAM AUTO_INCREMENT=155 DEFAULT CHARSET=latin1;
  207. /*!40101 SET character_set_client = @saved_cs_client */;
  208.  
  209. --
  210. -- Table structure for table `t_situacion`
  211. --
  212.  
  213. DROP TABLE IF EXISTS `t_situacion`;
  214. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  215. /*!40101 SET character_set_client = utf8 */;
  216. CREATE TABLE `t_situacion` (
  217.   `id` int(11) NOT NULL AUTO_INCREMENT,
  218.   `id_situacion` varchar(255) DEFAULT NULL,
  219.   `nombre_situacion` varchar(255) DEFAULT NULL,
  220.   `id_poblacion` varchar(255) DEFAULT NULL,
  221.   PRIMARY KEY (`id`)
  222. ) ENGINE=MyISAM AUTO_INCREMENT=69337 DEFAULT CHARSET=latin1;
  223. /*!40101 SET character_set_client = @saved_cs_client */;
  224.  
  225. --
  226. -- Table structure for table `t_tipo`
  227. --
  228.  
  229. DROP TABLE IF EXISTS `t_tipo`;
  230. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  231. /*!40101 SET character_set_client = utf8 */;
  232. CREATE TABLE `t_tipo` (
  233.   `id` int(11) NOT NULL AUTO_INCREMENT,
  234.   `id_tipo` varchar(255) DEFAULT NULL,
  235.   `id_familia_tipo` varchar(255) DEFAULT NULL,
  236.   `nombre_tipo_es` varchar(255) DEFAULT NULL,
  237.   `nombre_tipo_ca` varchar(255) DEFAULT NULL,
  238.   `nombre_tipo_fr` varchar(255) DEFAULT NULL,
  239.   `nombre_tipo_en` varchar(255) DEFAULT NULL,
  240.   `nombre_tipo_de` varchar(255) DEFAULT NULL,
  241.   PRIMARY KEY (`id`)
  242. ) ENGINE=MyISAM AUTO_INCREMENT=14669 DEFAULT CHARSET=latin1;
  243. /*!40101 SET character_set_client = @saved_cs_client */;
[/HIGHLIGHT]
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #6 (permalink)  
Antiguo 30/09/2014, 15:33
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Código MySQL:
Ver original
  1. --
  2. -- Table structure for table `t_un`
  3. --
  4.  
  5. /*!40101 SET @saved_cs_client     = @@character_set_client */;
  6. /*!40101 SET character_set_client = utf8 */;
  7. CREATE TABLE `t_un` (
  8.   `id` int(11) NOT NULL AUTO_INCREMENT,
  9.   `id_piso` varchar(25) DEFAULT NULL,
  10.   `referencia` varchar(25) DEFAULT NULL,
  11.   `operacion` int(11) DEFAULT NULL,
  12.   `tipo` varchar(255) DEFAULT NULL,
  13.   `familia` varchar(255) DEFAULT NULL,
  14.   `poblacion` varchar(255) DEFAULT NULL,
  15.   `situacion1` varchar(255) DEFAULT NULL,
  16.   `situacion2` varchar(255) DEFAULT NULL,
  17.   `foto1` varchar(255) DEFAULT NULL,
  18.   `foto2` varchar(255) DEFAULT NULL,
  19.   `foto3` varchar(255) DEFAULT NULL,
  20.   `foto4` varchar(255) DEFAULT NULL,
  21.   `foto5` varchar(255) DEFAULT NULL,
  22.   `foto6` varchar(255) DEFAULT NULL,
  23.   `precio` decimal(10,2) DEFAULT NULL,
  24.   `habitaciones` int(11) DEFAULT NULL,
  25.   `metros` decimal(10,0) DEFAULT NULL,
  26.   `estado` int(11) DEFAULT NULL,
  27.   `fechaHoraRegistro` datetime DEFAULT NULL,
  28.   `CodigoPostal` varchar(255) DEFAULT NULL,
  29.   `DireccionInmueble` varchar(255) DEFAULT NULL,
  30.   `AbreviacionTipoCalle` varchar(255) DEFAULT NULL,
  31.   `NombreCalleInmueble` varchar(255) DEFAULT NULL,
  32.   `AbreviacionTipoNumero` varchar(255) DEFAULT NULL,
  33.   `NumeroCalleInmueble` varchar(255) DEFAULT NULL,
  34.   `Parametrizable1` int(11) DEFAULT NULL,
  35.   `google_lat` varchar(255) DEFAULT NULL,
  36.   `google_lng` varchar(255) DEFAULT NULL,
  37.   PRIMARY KEY (`id`),
  38.   KEY `foto2` (`foto2`)
  39. ) ENGINE=MyISAM AUTO_INCREMENT=325928 DEFAULT CHARSET=latin1;
  40. /*!40101 SET character_set_client = @saved_cs_client */;
  41. /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
  42.  
  43. /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
  44. /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
  45. /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
  46. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  47. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  48. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  49. /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
  50.  
  51. -- Dump completed on 2014-09-30 23:23:55
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #7 (permalink)  
Antiguo 01/10/2014, 06:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo indexar la base de datos

Mira, todavía estoy revisando tu problema (también trabajo todo el día), pero en esencia el problema tiene varios frentes:
1) Las consultas son ineficientes por falta de indices en algunos casos, excesos de indices en otros, uso de subconsultas en el WHERE (ineficientes mayoritariamente), y utilizacion de JOINs imnplícitos (la coma), en lugar de explicitos.
2) Las tablas no están normalizadas, ni siquiera están en la 1FN, lo que obliga a realizar consultas completamente antiperformánticas. Si se las redujese, tendrías muchísimos menos problemas.
3) La selección de tipos de datos y sus longutudes es equivocada en muchos casos. El error de los tipos peude causar que los índices que se puedan crear no aporten suficiente optimización.
4) Los campos de TEXT deberían ser usados en índices de tipo FULLTEXT, aprovechando que usas tablas MySAM.
5) El uso de ORDER BY conspira contra el resultado ya que es una de las cláusulas asesinas de performance, en especial con consultas que devuelven muchos registros.
6) otros...

Es evidente, por algunos detalles, que estás basandote en documentación obsoleta (algo muy comun en la web), ya que te comento que un VARCHAR no mtiene actualmente un límitte de 255 caracteres. Eso ocurría hace casi diez años atrás, pero no ahora. El límite está bastante más arriba, y ese cambio podría ayudar a evitar usar columnas de tipo TEXT, que exigen al motor de base de datos otro tipo de recursos.
Esta noche termino de mirar bien lo que has posteado pero desde ya hasy bastante que se puede mejorar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 01/10/2014, 07:04
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Gracias gnzsoloyo, me has hundido!
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #9 (permalink)  
Antiguo 01/10/2014, 07:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo indexar la base de datos



Tranquilo... todo es solucionable, aunque requerirá algo de esfuerzo y paciencia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 01/10/2014, 09:08
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Gnzsoloyo, estoy analizando la base de datos.
1.- las tablas tienen solamente un índice, el de la clave principal, ninguno más, por lo que no entiendo que digas exceso de índices.
2.- dices que no está en 1FN, porqué existe algun campo vació?
3.- puedo repasar el tipo de campos
4.- "Los campos de TEXT deberían ser usados en índices de tipo FULLTEXT, aprovechando que usas tablas MySAM.", no entiendo a qué campos te refieres, los varchar?
5.- En cuanto al order? Pero si quieres los campos ordenados, cómo lo haces?

Muchas gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #11 (permalink)  
Antiguo 01/10/2014, 09:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo indexar la base de datos

Cita:
1.- las tablas tienen solamente un índice, el de la clave principal, ninguno más, por lo que no entiendo que digas exceso de índices.
Código MySQL:
Ver original
  1. CREATE TABLE `t_administradores` (
  2.   `user` varchar(20) NOT NULL,
  3.   `pass` varchar(20) NOT NULL,
  4.   PRIMARY KEY (`id`),
  5.   KEY `pass` (`pass`),
  6.   KEY `user` (`user`),
  7.   KEY `pass_2` (`pass`),
  8.   KEY `id` (`id`),
  9.   KEY `user_2` (`user`),
  10.   KEY `id_2` (`id`),
  11.   KEY `user_3` (`user`),
  12.   KEY `pass_3` (`pass`),
  13.   KEY `id_3` (`id`)
Cada indicacion d KEY crea un índice...
Cita:
2.- dices que no está en 1FN, porqué existe algun campo vació?
Un campo vacío no implica que no esté en 1FN. Entre otras cosas tienes más de un campo sobre el mismo dominio, por ejemplo:

Código MySQL:
Ver original
  1. CREATE TABLE `t_un` (
  2. ....
  3.   `foto1` varchar(255) DEFAULT NULL,
  4.   `foto2` varchar(255) DEFAULT NULL,
  5.   `foto3` varchar(255) DEFAULT NULL,
  6.   `foto4` varchar(255) DEFAULT NULL,
  7.   `foto5` varchar(255) DEFAULT NULL,
  8.   `foto6` varchar(255) DEFAULT NULL,
  9. ...
  10. ) ENGINE=MyISAM AUTO_INCREMENT=325928 DEFAULT CHARSET=latin1;
y eso está mal diseñado. Eso se debe haer con una tabla adicional, y no agregando campos, ni aún cuando los uses todos.
Nota: eso no es lo único que define la 1FN.

Cita:
4.- "Los campos de TEXT deberían ser usados en índices de tipo FULLTEXT, aprovechando que usas tablas MySAM.", no entiendo a qué campos te refieres, los varchar?
A este caso, por ejemplo:
Código MySQL:
Ver original
  1. CREATE TABLE `t_en` (
  2.   ...
  3.   `descripcion` text,
  4.   ...
  5. ) ENGINE=MyISAM;
Y NO, no confundo TEXT con VARCHAR...
Cita:
5.- En cuanto al order? Pero si quieres los campos ordenados, cómo lo haces?
No dije que no se pueda usar, sino que cuando la consulta devuelve muchos registros el ORDER BY, así como el GROUP BY, son asesinos de performance. En esos casos lo primero que hay que ver es un buen EXPLAIN de la consulta, para asegurrse que sea óptima.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 01/10/2014, 12:17
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Gracias gnzsoloyo,
Si vamos a analizar la estructura de la base de datos he procedido a eliminar todas aquellas tablas y campos que ya no se usan.
La tabla Administradores, la que tenía definidos tantos índices ya no existe, por lo tanto, punto 1 solucionado.
En cuanto al punto 2. Estoy de acuerdo con lo que dices, pero en este caso tampoco lo veo tan mal. Te diré el porqué y díme si estás de acuerdo. Esta base de datos se alimenta de un programa de gestión. Sólo se vuelcan los datos que interesan para la web. Este programa obliga a introducir les 6 fotos, por lo que siendo fijo, no veo la necesidad de crear una tabla adicional. Además la consulta es más fácil con una sola tabla.
No te enfades, ya sé que no confundes Text con Varchar, pero trato de entenderte, por este motivo repito con mis palabras para asegurarme
Las consultas que se hacen devuelven muy pocos registros, como mucho, en el peor de los casos, 40 o 50. Y deben salir ordenados según petición. Es que no conozco otra forma de ordenar.
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #13 (permalink)  
Antiguo 04/10/2014, 13:10
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Buenas, sigo con el tema.
Una consulta, de las más complejas que hay en la web y que tarda mucho es la siguiente:

Código MySQL:
Ver original
  1. SELECT un.*, es.titulo, es.descripcion, po.nombre_poblacion, ti.nombre_tipo_ca, op.operacion_tipo_ca
  2. FROM t_un as un, t_ca as es, t_poblacion as po, t_tipo as ti, t_operacion as op WHERE un.id_piso = es.id_piso AND un.poblacion = po.id_poblacion AND un.tipo = ti.id_tipo AND un.operacion = op.id_operacion AND un.referencia
  3. IN ((SELECT first FROM t_destacados WHERE id_cat='3'), (SELECT second FROM t_destacados WHERE
  4. id_cat='3'), (SELECT third FROM t_destacados WHERE id_cat='3'), (SELECT forth FROM t_destacados WHERE
  5. id_cat='3'), (SELECT fifth FROM t_destacados WHERE id_cat='3'), (SELECT sixth FROM t_destacados WHERE
  6. id_cat='3')) LIMIT 0, 6

He probado con estas dos, que:
Código MySQL:
Ver original
  1. SELECT un.*, es.titulo, es.descripcion, po.nombre_poblacion, ti.nombre_tipo_".$idioma.", op.operacion_tipo_".$idioma.
  2. FROM t_un as un, t_".$idioma." as es, t_poblacion as po, t_tipo as ti, t_operacion as op
  3. WHERE un.id_piso = es.id_piso AND un.poblacion = po.id_poblacion AND un.tipo = ti.id_tipo
  4. AND un.operacion = op.id_operacion AND (un.referencia = ".$oportunitats['1']."
  5. or un.referencia = ".$oportunitats['2']." or un.referencia = ".$oportunitats['3']."
  6. or un.referencia = ".$oportunitats['4']."
  7. or un.referencia = ".$oportunitats['5']."
  8. or un.referencia = ".$oportunitats['6'].")

Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.
Pero el tiempo de respuesta es más o menos igual. Alguna sugerencia o manera de optimizar esta consulta?

Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no

Última edición por gnzsoloyo; 04/10/2014 a las 15:55
  #14 (permalink)  
Antiguo 04/10/2014, 16: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: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo indexar la base de datos

Cita:
Una consulta, de las más complejas que hay en la web y que tarda mucho es la siguiente:
La consulta es "compleja" porque está basada en una tabla sin normalizar. De allí que necesites hacer cosas normalmente inexistentes.
Para mantener la base sin tocar, y tratar de hacerla más eficiente, hay que forzar el uso de ciertas funciones que no serían necesarias en tablas bien definidas.
Esto sería un acercamiento:
Código MySQL:
Ver original
  1.     un . *,
  2.     es.titulo,
  3.     es.descripcion,
  4.     po.nombre_poblacion,
  5.     ti.nombre_tipo_ca,
  6.     op.operacion_tipo_ca
  7.     t_un as un,
  8.     t_ca as es,
  9.     t_poblacion as po,
  10.     t_tipo as ti,
  11.     t_operacion as op
  12.     un.id_piso = es.id_piso
  13.         AND un.poblacion = po.id_poblacion
  14.         AND un.tipo = ti.id_tipo
  15.         AND un.operacion = op.id_operacion
  16.         AND FIND_IN_SET((SELECT CONCAT(first, ', ', second, ', ', third, ', ', forth, ', ', fifth, ', ', sixth)
  17.                 FROM t_destacados
  18.                 WHERE id_cat = 3), un.referencia )
  19.  
  20. LIMIT 0 , 6

REspecto a la segunda, el sólo hecho de que estés definiendo los nombres de las tablas dinámicamente de esa forma, me habla de problemas de diseño mayores aún. Por otro lado, no nos sirve que postees código de programación (cosa que desde ya es OFF TOPIC), sino que en todo caso necesitaríamos que nos postearas la sentencia como finalmente queda creada, es decir lo que MySQL realmente recibe.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 05/10/2014, 01:40
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Buenas gnzsoloyo,
No entiendo porqué me dices que se trata de una tabla no normalizada, partiendo de esta consulta:
Existe la tabla t_un, con el campo referencia y otros más
Existe la tabla t_destacados, que contiene las referencias de los 6 inmuebles destacados, y por el orden que el propio nombre del campo indica. Existen siempre las 6 referencias

Tampoco entiendo porqué dices que estoy definiendo los nombres de las tablas dinámicamente. Lo que hago es primero obtener las 6 referencias de la tabla destacados y luego montar el where en la segunda tabla, ya con los valores (a no ser que lo digas por lo del idioma, es que el campo es, por ejemplo, nombre_tipo_ca si está en catalán, nombre_tipo_es si está en español, ....)

Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #16 (permalink)  
Antiguo 05/10/2014, 03:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo indexar la base de datos

Que he existan siempre las seis referencias, y que el orden sea uno determinado, no implica que deba haber seis campos en una tabla dedicados a ello.
Algo que creo que ya mencioné es que la 1FN claramente expresa que no deben existir campos diferentes que posean el mismo dominio, y en este caso cada campo contiene la referencia a un inmueble. Para el caso es el mismo dominio, que los seis VALORES puedan ser diferentes es un tema procedimental, no de bases de datos, desde la óptica del diseño de datos, estas poniendo campos que comparten dominios (son inmuebles), y eso está mal.
Si esa referencia se pudiese sacar de la tabla y pasarla a otra tabla, la consulta se volvería mucho más simple en ciertas cosas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 05/10/2014, 04:10
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Gracias por responder.
Es decir, tu crees que la consulta sería mucho más rápida si en lugar de existir esto:
-tabla1.referencia
-tabla2 con los siguientes campos:
- id_cat
- first
- second
- third
- forth
- fifth
- sixth

Existiera esto:
-tabla1.referencia
-y la tabla2:
- id_cat
- orden
- referencia

Y la consulta debería ser así:
Código MySQL:
Ver original
  1. SELECT tabla1.*
  2. FROM tabla2, tabla1
  3. WHERE tabla2.id_cat = '3' AND
  4.         tabla2.referencia = tabla1.referencia
  5. ORDER BY orden

Acabo de probarlo gnzsoloyo. Rapidísimo!!!!

No marco el tema como solucionado, porqué ahora voy a intentar modificar la base de datos y no sé si me surgirá algun problema
__________________
Qué fácil cuando lo sabes y qué difícil cuando no

Última edición por mblascog; 05/10/2014 a las 04:22
  #18 (permalink)  
Antiguo 05/10/2014, 06:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo indexar la base de datos



Como notas:
- Trata de no usar JOIN implícitos (la coma), sino explícitos. Son más eficientes y con menos tendencia a errores por nombres de campos. En especial con tablas InnoDB son más eficientes ya que ese tipo de tablas tiene indices especiales para la administración de las FK.
- Es conveniente que te acostumbres a usar alias cuando usas JOINs, para facilitar la legibilidad de los códigos SQL.
- Los valores numéricos no deben ser comparados como cadenas. Hacer eso obliga a MySQL a realizar conversiones implícitas que pueden terminar pagándose con performance cuando son miles de registros.
- El uso de comparaciones como cadenas de texto para facilitar la programación, también, esconde problemas de programación cuando el valor a comparar no llega a la sentencia, pero queda oculto al escribirse como una cadena vacía. Recordar que una cadena vacía no es NULL...

Usando INNER JOIN (JOIN explícito) quedaría mas o menos así:
Código MySQL:
Ver original
  1. SELECT T1.*
  2. FROM tabla2 T1 INNER JOIN tabla1 T1 ON T2.referencia = T1.referencia
  3. WHERE tabla2.id_cat = '3'
  4. ORDER BY orden
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #19 (permalink)  
Antiguo 05/10/2014, 06:33
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Gracias gnzsoloyo. Tomo nota, en estos momentos estoy modificando la web para adaptarla al cambio de la base de datos.
Cuando acabe lo pruebo.
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #20 (permalink)  
Antiguo 05/10/2014, 14:55
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Buenas, ya he hecho los cambios. Esta consulta funciona:

Código MySQL:
Ver original
  1. SELECT t_un . *
  2. FROM t_destacats
  3. INNER JOIN t_un ON t_destacats.referencia = t_un.referencia
  4. WHERE t_destacats.id_cat =3
  5. ORDER BY t_destacats.ordre

Pero necesito campos de otras tablas y añadir alguna condición al WHERE y no me sale. Tendría que ser algo así, pero no funciona:

Código MySQL:
Ver original
  1. SELECT t_un.*, es.titulo, es.descripcion, po.nombre_poblacion, ti.nombre_tipo_ca, op.operacion_tipo_ca
  2. FROM t_destacats, t_ca as es, t_poblacion as po, t_tipo as ti, t_operacion as op INNER JOIN t_un ON t_destacats.referencia = t_un.referencia
  3. WHERE t_destacats.id_cat = 3 AND t_un.id_piso = es.id_piso AND t_un.poblacion = po.id_poblacion AND t_un.tipo = ti.id_tipo AND t_un.operacion = op.id_operacion
  4. ORDER BY t_destacats.ordre

Da el error de t_destacats.referencia unknown.
No sé como hacerlo, pero creo que lo estoy haciendo muy mal. Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no

Última edición por mblascog; 05/10/2014 a las 15:03
  #21 (permalink)  
Antiguo 05/10/2014, 17:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo indexar la base de datos

Primero, no mezcles JOINs implícitos (la coma) con explícitos. Los resultados tienden a ser erróneos o disparar errores de sintaxis o lógica inesperados y a veces difíciles de diagnosticar.
La query debería ser así, según lo que nos muestras:
Código MySQL:
Ver original
  1.     t_un . *,
  2.     es.titulo,
  3.     es.descripcion,
  4.     po.nombre_poblacion,
  5.     ti.nombre_tipo_ca,
  6.     op.operacion_tipo_ca
  7.     t_destacats d
  8.     INNER JOIN t_un U ON d.referencia = U.referencia
  9.     INNER JOIN t_ca es ON U.id_piso = es.id_piso
  10.     INNER JOIN t_poblacion po ON U.poblacion = po.id_poblacion
  11.     INNER JOIN t_tipo ti ON U.tipo = ti.id_tipo
  12.     INNER JOIN t_operacion op ON U.operacion = op.id_operacion
  13.     D.id_cat = 3
  14. ORDER BY D.ordre
Cita:
Da el error de t_destacats.referencia unknown.
Eso implica que la columna "referencia" no existe con ese nombre en la tabla "t_destacats". Sin ver el CREATE TABLE de esa tabla no puedo saber si es un error real, o es que hay un error de interpretación del parser.
POdrías postear el resultado de esto?:
Código MySQL:
Ver original
  1. SHOW CREATE TABLE t_destacats;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #22 (permalink)  
Antiguo 06/10/2014, 00:43
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Buenas,
He ejecutado la consulta, pero ya vuelvo a tener el problema.

t_destacats:
Código MySQL:
Ver original
  1. CREATE TABLE `t_destacats` (
  2.  `id_cat` int(11) NOT NULL,
  3.  `ordre` int(11) NOT NULL,
  4.  `referencia` varchar(5) NOT NULL,
  5.  PRIMARY KEY (`id`),
  6.  KEY `ordre` (`ordre`)

t_poblacion
Código MySQL:
Ver original
  1. CREATE TABLE `t_poblacion` (
  2.  `id_poblacion` int(11) DEFAULT NULL,
  3.  `nombre_poblacion` varchar(30) DEFAULT NULL,
  4.  `id_provincia` int(11) DEFAULT NULL,
  5.  PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM AUTO_INCREMENT=29569 DEFAULT CHARSET=latin1

t_ca
Código MySQL:
Ver original
  1. CREATE TABLE `t_ca` (
  2.  `id_piso` varchar(25) DEFAULT NULL,
  3.  `titulo` varchar(120) DEFAULT NULL,
  4.  `descripcion` text,
  5.  PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM AUTO_INCREMENT=510545 DEFAULT CHARSET=latin1

t_tipo
CREATE TABLE `t_tipo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_tipo` int(11) DEFAULT NULL,
`id_familia_tipo` int(11) DEFAULT NULL,
`nombre_tipo_es` varchar(50) DEFAULT NULL,
`nombre_tipo_ca` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=15060 DEFAULT CHARSET=latin1

t_operacion
Código MySQL:
Ver original
  1. CREATE TABLE `t_operacion` (
  2.  `id_operacion` int(11) DEFAULT NULL,
  3.  `operacion_tipo_es` varchar(50) DEFAULT NULL,
  4.  `operacion_tipo_ca` varchar(50) DEFAULT NULL,
  5.  PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM AUTO_INCREMENT=2553 DEFAULT CHARSET=latin1

Me he dado cuenta que al crear la tabla t_destacats, con la estructura que me sugeristes, se me ha creado como InnoDB, no como MyISAM. Intento cambiarla pero no me deja.
No sé qué es lo que exactamente hace que vaya todo tan lento.

Gracias
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #23 (permalink)  
Antiguo 06/10/2014, 14:22
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Buenas,
He ido probando inner join a inner join, para ver cual era la que enlentecía la consulta. He observado que a partir del tercero iba muy lento, fuera cual fuera el orden.
Como las tablas sólo tenían la clave principal como índice, he añadido índices a todos los campos del inner join y va rapidísimo.

Muchas gracias.
__________________
Qué fácil cuando lo sabes y qué difícil cuando no
  #24 (permalink)  
Antiguo 06/10/2014, 14:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cómo indexar la base de datos

Es algo que puede ocurrir...
La lentitud de una consulta puede deberse a multiples factores, pero sustancialmente lo que más imapcta es la cardinalidad de las relaciones. Si una de las tablas tiene una selectividad demasiado baja (cada registor d eotra devuelve muchos de esa), es muy probable que una indexación de alguno de los campos de esa tabla mejore la performance, o bien que se pueda indicar condiciones que aumenten la selectividad de ese caso en especial
Alli los índices empiezan a tener más impacto.
Lo que suele convenir es verificar el plan de consultas de la query usada con EXPLAIN, para ver dónde está perdiendo performance:
Código MySQL:
Ver original
  1.     t_un . *,
  2.     es.titulo,
  3.     es.descripcion,
  4.     po.nombre_poblacion,
  5.     ti.nombre_tipo_ca,
  6.     op.operacion_tipo_ca
  7.     t_destacats d
  8.     INNER JOIN t_un U ON d.referencia = U.referencia
  9.     INNER JOIN t_ca es ON U.id_piso = es.id_piso
  10.     INNER JOIN t_poblacion po ON U.poblacion = po.id_poblacion
  11.     INNER JOIN t_tipo ti ON U.tipo = ti.id_tipo
  12.     INNER JOIN t_operacion op ON U.operacion = op.id_operacion
  13.     D.id_cat = 3
  14. ORDER BY D.ordre
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #25 (permalink)  
Antiguo 07/10/2014, 01:36
 
Fecha de Ingreso: enero-2002
Ubicación: Sabadell
Mensajes: 565
Antigüedad: 22 años, 3 meses
Puntos: 4
Respuesta: Cómo indexar la base de datos

Gracias gnzsoloyo. Ayuda Explain ayuda a comprobar si tienes las tablas bien indexadas. Pero como interpretas donde ser pierde el performance?
__________________
Qué fácil cuando lo sabes y qué difícil cuando no

Etiquetas: campo, indexar, registro, tabla
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 14:19.