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

Problema select tabla 45.000 registros

Estas en el tema de Problema select tabla 45.000 registros en el foro de Mysql en Foros del Web. Hola, Actualmente estoy trabajando en un proyecto en php, el cuál obtiene la información de base de datos de archivos access(.mdb). No tenemos mayores problemas ...
  #1 (permalink)  
Antiguo 05/08/2014, 02:19
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Problema select tabla 45.000 registros

Hola,

Actualmente estoy trabajando en un proyecto en php, el cuál obtiene la información de base de datos de archivos access(.mdb).

No tenemos mayores problemas con este proceso, creamos las tablas con los campos que consideramos son los más óptimos para cada caso etc.

El problema es que tenemos una tabla, la cuál contiene 45.000 registros con 30 campos, la mayoría varchar de 255, y, al hacerle una select * o una select c1, c2, c3, c4, dependiendo del servidor dónde la lancemos tarda más o menos.

Por ejemplo, en mi máquina local(localhost) tarda unos 12 segundos(es demasiado), en otro server con un sistema parecido pero con windows server 2003 tarda 1, o 2, en cambio en otro server con un servicio de hosting tarda entre 10 y 30 segundos.

Lo bueno de todo esto es que tenemos alguna tabla con más o menos los mismos registros que tiran en 0, es decir, trabajan de forma correcta, así que no es problema del server así a mayores, pero hay algo que se nos escapa y ni yo ni mis compañeros somos capaces de entender.

Agradecería un poco de colaboración a ver si alguien se ha visto en un caso similar y nos puede echar un cable.

Nuestras tablas trabajan todas con innodb, por si es un dato interesante.

No hemos tocado nada de la configuración de mysql.

Saludos.
__________________
Puedes visitarme en uno-de-piera
  #2 (permalink)  
Antiguo 05/08/2014, 06:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Problema select tabla 45.000 registros

Cita:
de archivos access(.mdb).
y

Cita:
Nuestras tablas trabajan todas con innodb
en que quedamos?

Cita:
más o menos los mismos registros que tiran en 0
mismo tipo de campos? Mismo contenido? Todo ello afecta a la respuesta.

Manda la estructura de la tabla en cuestión y la o las consultas que demoran y alguien te podrá decir algo.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 05/08/2014, 06: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, 5 meses
Puntos: 2658
Respuesta: Problema select tabla 45.000 registros

Cita:
Actualmente estoy trabajando en un proyecto en php, el cuál obtiene la información de base de datos de archivos access(.mdb).
Ponte de acuerdo: o trabajas con Access, o con MySQL. Los hibridos nunca funcionan bien.

Si quieres consejos para Access, muevo tu post al foro de BBDD General.

Por otro lado:
Cita:
al hacerle una select * o una select c1, c2, c3, c4, dependiendo del servidor dónde la lancemos tarda más o menos.
Eso es de cajón. Toda consulta con "*"va a tardar siempre más que una donde defines qué campos quieres, sea porque sobrecargas la conexion de datos-basura, como porque en el DBMS usas más bloques de datos en memoria de los necesarios, y además saturas innecesariamente el buffer de consultas.

Pero empecemos por el principio... ¿Access o MySQL?
__________________
¿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 05/08/2014, 07:03
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Respuesta: Problema select tabla 45.000 registros

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Ponte de acuerdo: o trabajas con Access, o con MySQL. Los hibridos nunca funcionan bien.

Si quieres consejos para Access, muevo tu post al foro de BBDD General.

Por otro lado:

Eso es de cajón. Toda consulta con "*"va a tardar siempre más que una donde defines qué campos quieres, sea porque sobrecargas la conexion de datos-basura, como porque en el DBMS usas más bloques de datos en memoria de los necesarios, y además saturas innecesariamente el buffer de consultas.

Pero empecemos por el principio... ¿Access o MySQL?
Hola y gracias por responder,

No me he explicado bien, hacemos una importación de access a mysql, es decir, cogemos la información del access y hacemos n inserts en mysql.

Por cada campo que añadimos a la consulta, select c1, c2, c3, c4 tarda prácticamente un segundo más.

Este es el esquema de la tabla en cuestión:

Código MySQL:
Ver original
  1. CREATE TABLE `actividades` (
  2.   `c1` int(10) unsigned NOT NULL,
  3.   `c2` varchar(45) DEFAULT NULL,
  4.   `c3` varchar(255) DEFAULT NULL,
  5.   `c4` varchar(255) DEFAULT NULL,
  6.   `c6` varchar(45) DEFAULT NULL,
  7.   `c7` varchar(45) DEFAULT NULL,
  8.   `c8` varchar(45) DEFAULT NULL,
  9.   `c9` varchar(255) DEFAULT NULL,
  10.   `municipi` varchar(45) DEFAULT NULL,
  11.   `Comarca` varchar(255) DEFAULT NULL,
  12.   `territori` varchar(255) DEFAULT NULL,
  13.   `lloc` varchar(255) DEFAULT NULL,
  14.   `LlocResumit` text,
  15.   `NOTES` text,
  16.   `c10` varchar(255) DEFAULT NULL,
  17.   `c11` varchar(255) DEFAULT NULL,
  18.   `c12` varchar(255) DEFAULT NULL,
  19.   `c13` varchar(255) DEFAULT NULL,
  20.   `c14` varchar(255) DEFAULT NULL,
  21.   `c15` varchar(255) DEFAULT NULL,
  22.   `c16` varchar(255) DEFAULT NULL,
  23.   `c17` varchar(255) DEFAULT NULL,
  24.   `c18` varchar(255) DEFAULT NULL,
  25.   `fk_ident` int(11) DEFAULT NULL,
  26.   `c19` text,
  27.   `c20` varchar(255) DEFAULT NULL,
  28.   `c21` varchar(255) DEFAULT NULL,
  29.   `c22` varchar(45) DEFAULT NULL,
  30.   `c23` varchar(120) DEFAULT NULL,
  31.   `c24` float(10,6) DEFAULT NULL,
  32.   `c25` float(10,6) DEFAULT NULL,
  33.   `c26` float(10,6) DEFAULT NULL,
  34.   `c27` float(10,6) DEFAULT NULL,
  35.   `c28` varchar(45) DEFAULT NULL,
  36.   `indret` varchar(255) DEFAULT NULL,
  37.   `id_poblacio` int(10) unsigned DEFAULT NULL,
  38.   `id_comarca` int(10) unsigned DEFAULT NULL,
  39.   `id_territori` int(10) unsigned DEFAULT NULL,
  40.   `latitudPoblacio` float(10,6) DEFAULT NULL,
  41.   `longitudPoblacio` float(10,6) DEFAULT NULL,
  42.   `c29` int(10) DEFAULT NULL,
  43.   PRIMARY KEY (`id`)

No podemos hacer un select de menos campos, los utilizamos todos, de todas formas, no hacemos un select *

Gracias y saludos.
__________________
Puedes visitarme en uno-de-piera
  #5 (permalink)  
Antiguo 05/08/2014, 07:07
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Respuesta: Problema select tabla 45.000 registros

Gracias por la respuesta,

Es exactamente la misma base de datos en 3 servidores distintos, uno en mi local(va bastante lento), otra que va relativamente bien(2 segndos un select *) en la misma red con un windows server 2003 y otra en un servicio de hosting que tenemos contratado que va tremendamente mal.

De nuevo gracias por vuestro tiempo.

Saludos.
__________________
Puedes visitarme en uno-de-piera
  #6 (permalink)  
Antiguo 05/08/2014, 07:58
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, 5 meses
Puntos: 2658
Respuesta: Problema select tabla 45.000 registros

Más allá de las diferencias de configuración y recursos que tenga cada servidor (no alcanza con lo que dices como para dar una opinión), esa tabla la veo con bastantes problemas.
Como mínimo, no veo que tenga índices definidos, por lo que cualquier consulta basada en los campos VARCHAR será forzosamente ineficeinte.
Por otro lado, veo que no está normalizada, o al menos estos segmentos me sugieren que hay desnormalización, cosa que siemrpe se paga con performance:
Código MySQL:
Ver original
  1. `c2` varchar(45) DEFAULT NULL,
  2.   `c3` varchar(255) DEFAULT NULL,
  3.   `c4` varchar(255) DEFAULT NULL,
  4.   `c6` varchar(45) DEFAULT NULL,
  5.   `c7` varchar(45) DEFAULT NULL,
  6.   `c8` varchar(45) DEFAULT NULL,
  7.   `c9` varchar(255) DEFAULT NULL,
  8. ...
  9.   `LlocResumit` text,
  10.   `NOTES` text,
  11. ...
  12.   `c10` varchar(255) DEFAULT NULL,
  13.   `c11` varchar(255) DEFAULT NULL,
  14.   `c12` varchar(255) DEFAULT NULL,
  15.   `c13` varchar(255) DEFAULT NULL,
  16.   `c14` varchar(255) DEFAULT NULL,
  17.   `c15` varchar(255) DEFAULT NULL,
  18.   `c16` varchar(255) DEFAULT NULL,
  19.   `c17` varchar(255) DEFAULT NULL,
  20.   `c18` varchar(255) DEFAULT NULL,
  21. ...
  22.   `c19` text,
  23. ...
  24.   `c20` varchar(255) DEFAULT NULL,
  25.   `c21` varchar(255) DEFAULT NULL,
  26.   `c22` varchar(45) DEFAULT NULL,
  27.   `c23` varchar(120) DEFAULT NULL,
  28.   `c24` float(10,6) DEFAULT NULL,
  29.   `c25` float(10,6) DEFAULT NULL,
  30.   `c26` float(10,6) DEFAULT NULL,
  31.   `c27` float(10,6) DEFAULT NULL,
  32.   `c28` varchar(45) DEFAULT NULL,
  33. ...
  34.   `c29` int(10) DEFAULT NULL,
Incluyo los campos TEXT, porque el sólo hecho de que sean nulables, me sugiere que son campos opcionales, y en consecuencia no deberían estar en la tabla base. En todo caso deberían estar en una tabla auxiliar.

El hecho de que los datos provengan de una única tabla de Access, no es óbice para no normalizar.
Yo he tenido la oportunidad de trabajar con datos provenientes de cuatro tablas de datos externas, desnormalizada, que luego de recuperada y normalizada la metíamos en 39 tablas diferentes. Y eso lo hacíamos para aumentar la eficiencia de la base.
Todo el tiempo de proceso que se gaste normalizando se gana luego en las consultas.

Finalmente, ¿Qué tipo de consultas hacen? ¿Las hacen con WHEREs sobre condiciones con esos campos VARCHAR? ¿REalizan JOINs de algún tipo?
¿Puedes mostrar algunos ejemplos?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 05/08/2014 a las 08:16
  #7 (permalink)  
Antiguo 06/08/2014, 01:13
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Respuesta: Problema select tabla 45.000 registros

Hola de nuevo,

El tema de la normalización es complejo con esta base de datos, aunque estoy completamente de acuerdo, (El hecho de que los datos provengan de una única tabla de Access, no es óbice para no normalizar).

El problema es que aunque suene extraño, no tenemos campos que sean not null en nuestra tabla, todos tienen algún valor que no nos provee datos.

Aún así podríamos mejorar su estructura y sacar campos que se repiten como localizaciones(comarcas, territorios etc).

La base de datos access es administrada por n personas y cada una lo hace a su criterio, para nosotros es incluso complicada su importación por muchos motivos.

Nosotros creamos la siguiente vista que hace una union all contra otra tabla

Código MySQL:
Ver original
  1. CREATE VIEW `vwtac` AS select
  2. `totact`.`tipus` AS `id_tipus`,
  3. `totact`.`id_unic` AS `id`,
  4. `totact`.`DIA` AS `data_inici`,
  5. `totact`.`DIA` AS `data_fi`,
  6. `totact`.`id_poblacio` AS `id_poblacio`,
  7. `totact`.`id_comarca` AS `id_comarca`,
  8. `totact`.`id_territori` AS `id_territori`,
  9. `totact`.`poblacio` AS `poblacio`,
  10. `totact`.`Comarca` AS `comarca`,
  11. `totact`.`territori` AS `territori`,
  12. `totact`.`municipi` AS `municipi`,
  13. `totact`.`cbla1` AS `cbl1`,
  14. `totact`.`cbla2` AS `cbl2`,
  15. `totact`.`cbla3` AS `cbl3`,
  16. `totact`.`cbla4` AS `cbl4`,
  17. `totact`.`cbla5` AS `cbl5`,
  18. `totact`.`cbla6` AS `cbl6`,
  19. `totact`.`cbla7` AS `cbl7`,
  20. 0 AS `id_indret`,
  21. `totact`.`latitud` AS `lat`,
  22. `totact`.`longitud` AS `lng`,
  23. 0 AS `idind`,
  24. `totact`.`latitudmaltemps` AS `lat_mal_temps`,
  25. `totact`.`longitudmaltemps` AS `lng_mal_temps`,
  26. `totact`.`latitudPoblacio` AS `latitudPoblacio`,
  27. `totact`.`longitudPoblacio` AS `longitudPoblacio`,
  28. `totact`.`LinkPrograma` AS `link_programa`,
  29. `totact`.`fkf` AS `programa`,
  30. `totact`.`HMATI` AS `hora1`,
  31. `totact`.`HTARDA` AS `hora2`,
  32. `totact`.`HNIT` AS `hora3`,
  33. '' AS `hora4`,
  34. `totact`.`descripcio` AS `desctipus`,
  35. `totact`.`lloc` AS `lloc`,
  36. `totact`.`llocre` AS `llocre`,
  37. `totact`.`sipl` AS `sipl`,
  38. `totact`.`splre` AS `splre`,
  39. `totact`.`idcl1` AS `idcl1` from `totac` `totact`
  40.  
  41.  
  42. 999 AS `id_tipus`,
  43. `tblcu`.`id` AS `id`,
  44. `tblcu`.`data_inici` AS `data_inici`,
  45. `tblcu`.`data_acabament` AS `data_fi`,
  46. `tblpob`.`id` AS `id_poblacio`,
  47. `tblcom`.`id` AS `id_comarca`,
  48. `tblter`.`id` AS `id_territori`,
  49. `tblpob`.`poblacio` AS `poblacio`,
  50. `tblcom`.`comarca` AS `comarca`,
  51. `tblter`.`territori` AS `territori`,
  52. '' AS `municipi`,
  53. '' AS `cbl1`,
  54. '' AS `cbl2`,
  55. '' AS `cbl3`,
  56. '' AS `cbl4`,
  57. '' AS `cbl5`,
  58. '' AS `cbl6`,
  59. '' AS `cbl7`,
  60. 0 AS `id_indret`,
  61. NULL AS `lat`,
  62. NULL AS `lng`,
  63. NULL AS `idind`,
  64. NULL AS `lat_mal_temps`,
  65. NULL AS `lng_mal_temps`,
  66. NULL AS `latitudPoblacio`,
  67. NULL AS `longitudPoblacio`,
  68. NULL AS `link_programa`,
  69. 0 AS `programa`,
  70. `tblcu`.`hini1` AS `hora1`,
  71. `tblcu`.`hfi1` AS `hora2`,
  72. `tblcu`.`hini2` AS `hora3`,
  73. `tblcu`.`hfi2` AS `hora4`,
  74. '' AS `desctipus`,
  75. '' AS `lloc`,
  76. '' AS `llocre`,
  77. '' AS `sipl`,
  78. '' AS `splre`,
  79. '' AS `idcl1`
  80. from (((`tblcu`
  81. join `tblpob` on((`tblcu`.`id_poblacio` = `tblpob`.`id`)))
  82. join `tblcom` on((`tblpob`.`id_comarca` = `tblcom`.`id`)))
  83. join `tblter` on((`tblcom`.`id_territori` = `tblter`.`id`)));

Una vez hecha la vista, como la aplicación soporta varios idiomas tenemos tablas de traducción contra la que hacemos su respectiva join, si esto no es suficiente, tenemos un buscador que genera consultas de este tipo:

Código MySQL:
Ver original
  1. (programa != 0 OR link_programa IS NOT NULL) AND data_inici BETWEEN '2010-08-06' AND '2015-08-31' AND id_tipus IN(1,5,4) AND vw.id_comarca IN(38,60) AND vw.id_territori IN(9,3,7) AND vw.id_poblacio IN(1037,1020) AND idcl1IN(225,145,224,300,192,335)

Finalmente con todo eso generamos una consulta que realiza una paginación mostrando 20, 30, 50 o 100 resultados a demanda del usuario.

Sí tenemos índices, son sobre los que hacemos las búsquedas, aunque no los hemos añadido, de todos modos, como puedes ver, hacemos búsquedas sobre campos de tipo entero y fechas.

Gracias por vuestra ayuda.
__________________
Puedes visitarme en uno-de-piera
  #8 (permalink)  
Antiguo 06/08/2014, 02:40
 
Fecha de Ingreso: mayo-2012
Mensajes: 49
Antigüedad: 12 años
Puntos: 2
Respuesta: Problema select tabla 45.000 registros

También decir que llevamos una pequeña estrategia de caché para consultas repetitivas, pero con esta información no puede ser aplicada porqué varia continuamente.
__________________
Puedes visitarme en uno-de-piera

Etiquetas: campo, php, registro, registros, select, sql, 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 17:02.