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

Optimización de consultas MySql y PHP

Estas en el tema de Optimización de consultas MySql y PHP en el foro de Mysql en Foros del Web. Buenos Días a todos. Yo aquí de nuevo con una de mis acostumbrados problemas de programación. Mi problema es el siguiente: Tengo una simple consulta: ...
  #1 (permalink)  
Antiguo 03/06/2016, 08:52
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Información Optimización de consultas MySql y PHP

Buenos Días a todos.

Yo aquí de nuevo con una de mis acostumbrados problemas de programación.

Mi problema es el siguiente:

Tengo una simple consulta:

Código MySQL:
Ver original
  1. SELECT * FROM inventario ORDER BY caja DESC  LIMIT 200
Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.
La consulta anterior me da como resultado las primeras 200 consultas de la tabla, pero tiene 774 en total y quiero que las 774 se muestren de una sola consulta sin necesidad de pagina ni limitar el resultado.

Entonces, al consultar los 200 registros tarda aproximadamente 20 segundos. Ahora, para consultar los 774 tardaría muchos más.

Esta es mi tabla:

Código MySQL:
Ver original
  1. CREATE TABLE inventario (
  2.   actualizacion    date,
  3.   caja      VARCHAR(20)   NOT NULL,
  4.   cliente  VARCHAR(50) NOT NULL,
  5.   localidad  VARCHAR(50) NOT NULL,
  6.   fecha_inicio  date,
  7.   fecha_final  date,
  8.   nota VARCHAR(100) NOT NULL
  9. );

No sé qué estoy haciendo mal, si es la programación en PHP o en MySql.

Espero me ayuden.

Un saludo

Última edición por gnzsoloyo; 03/06/2016 a las 09:08
  #2 (permalink)  
Antiguo 03/06/2016, 08:56
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Optimización de consultas MySql y PHP

Agregale algunos indices a tu tabla para que tarde menos en mostrar los 700 registros :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 03/06/2016, 09:16
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Optimización de consultas MySql y PHP

Cita:
Iniciado por Libras Ver Mensaje
Agregale algunos indices a tu tabla para que tarde menos en mostrar los 700 registros :)
Hola, Buenos Días Libras.

Soy nuevo con eso de los índices (De hecho con todo MySql).

Y supongo que al crearlos debo de escribir "FORCE INDEX" en la consulta de MySql o así no funciona.

Saludos.
  #4 (permalink)  
Antiguo 03/06/2016, 09:24
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: Optimización de consultas MySql y PHP

Cita:
Y supongo que al crearlos debo de escribir "FORCE INDEX" en la consulta de MySql o así no funciona.


NO. Lo que tienes que hacer es CREARLOS.

Por favor, comienza por leer el manual de referencia, en el punto que explica la creación de índices:

14.1.14 CREATE INDEX Syntax

FORCE INDEX se usa cuando ya los tienes y deseas que use alguno en especial, por fuera de su logia por default.

Por cierto, el manual tiene un capítulo entero dedicado a como usa MySQL los indices. Te recomiendo leerlo.
__________________
¿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 03/06/2016, 09:28
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Optimización de consultas MySql y PHP

Cita:
Iniciado por gnzsoloyo Ver Mensaje


NO. Lo que tienes que hacer es CREARLOS.

Por favor, comienza por leer el manual de referencia, en el punto que explica la creación de índices:

ALTER TABLE inventario ADD INDEX (caja)


FORCE INDEX se usa cuando ya los tienes y deseas que use alguno en especial, por fuera de su logia por default.

Por cierto, el manual tiene un capítulo entero dedicado a como usa MySQL los indices. Te recomiendo leerlo.

Sí yo sé en qué momento usarlo porque ya he creado un índice:

Código MySQL:
Ver original
  1. ALTER TABLE inventario ADD INDEX (caja)

Y a la vez he usado:

Código MySQL:
Ver original
  1. SELECT * FROM inventario FORCE INDEX (caja) ORDER BY caja DESC  LIMIT 200
Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.
Estoy bien??

Última edición por gnzsoloyo; 03/06/2016 a las 09:40
  #6 (permalink)  
Antiguo 03/06/2016, 09:45
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: Optimización de consultas MySql y PHP

¿Y estás seguro de que el índice se llama "caja"?

El indice genera un archivo en disco, y ese archivo es el que tiene el nombre del indice genera,do. Usualmente está relacionado con el nombre del campo, pero NO ES exactamente el mismo.
Código MySQL:
Ver original
  1. CREATE INDEX caja_idx ON inventario (caja);
Y luego lo usas:
Código MySQL:
Ver original
  1. FROM inventario FORCE INDEX (caja_idx)
  2.  LIMIT 200
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 03/06/2016, 10:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Optimización de consultas MySql y PHP

como se te dijo dale una leida al manual de referencia.......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 03/06/2016, 11:12
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Optimización de consultas MySql y PHP

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Y estás seguro de que el índice se llama "caja"?

El indice genera un archivo en disco, y ese archivo es el que tiene el nombre del indice genera,do. Usualmente está relacionado con el nombre del campo, pero NO ES exactamente el mismo.
Código MySQL:
Ver original
  1. CREATE INDEX caja_idx ON inventario (caja);
Y luego lo usas:
Código MySQL:
Ver original
  1. FROM inventario FORCE INDEX (caja_idx)
  2.  LIMIT 200

Buenas.

Esta es la tabla que hay en phpmyadmin

Código HTML:
Ver original
  1. Acción  Nombre de la clave  Tipo    Único   Empaquetado Columna Cardinalidad    Cotejamiento    Nulo    Comentario
  2. Editar Editar   Eliminar Eliminar   PRIMARY BTREE   Sí  No  id_inventario   763 A   No 
  3. Editar Editar   Eliminar Eliminar   caja_idx    BTREE   No  No  caja    254 A   No

Todo está bien?

El PRIMARY ya estaba por default y el otro índice fue el que acabo de poner
  #9 (permalink)  
Antiguo 03/06/2016, 11:16
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Optimización de consultas MySql y PHP

Cita:
Iniciado por Libras Ver Mensaje
como se te dijo dale una leida al manual de referencia.......
En eso estoy
  #10 (permalink)  
Antiguo 03/06/2016, 11:19
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: Optimización de consultas MySql y PHP

Cita:
Iniciado por planmental Ver Mensaje
Buenas.

Esta es la tabla que hay en phpmyadmin


Cita:
Nombre de la clave Tipo Único Empaquetado Columna Cardinalidad Cotejamiento Nulo Comentario
PRIMARY BTREE Sí No id_inventario 763 A No
caja_idx BTREE No No caja 254 A No
Todo está bien?

El PRIMARY ya estaba por default y el otro índice fue el que acabo de poner
Como se puede ver claramente en tu propio post, el índice se llama caja_idx , ese es el nombre con el que lo creó MySQL.

Haz el intento con ese mismo nombre.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 03/06/2016, 11:20
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Optimización de consultas MySql y PHP

Si te fijas tu indice se llama caja_idx no caja como pusiste en tu consulta
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 03/06/2016, 11:26
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Optimización de consultas MySql y PHP

Una duda que tengo.

Se puede asignar cualquier campo de la tabla como índice, o tiene que tener algo en específico.
  #13 (permalink)  
Antiguo 03/06/2016, 11:27
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
Cualquier duda, ejecuta esto:
Código MySQL:
Ver original
  1.     table_name, constraint_name, TABLE_SCHEMA, constraint_type
  2.     information_schema.table_constraints
  3.     UPPER(table_name) = 'INVENTARIO';

Cita:
Iniciado por planmental Ver Mensaje
Una duda que tengo.

Se puede asignar cualquier campo de la tabla como índice, o tiene que tener algo en específico.
La creación de índices es una decisión de diseño del sistema, y de análisis de performance.
Dependerá de las condiciones a cumplir en las diferentes consultas, saber si conviene o no crearlos. No existen reglas definidas para eso.

No pierdas tiempo en consideraciones irrelevantes al asunto a solucionar. Estás perdiendo el foco en el problema.

Simplemente ten en cuenta lo que el manual indica de las restricciones a la creacion de lso indices, y luego dedícate a analizar qué es lo que necesitas en aquellos momentos en que las consultas resultan con baja 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)
  #14 (permalink)  
Antiguo 03/06/2016, 11:36
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Optimización de consultas MySql y PHP

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Cualquier duda, ejecuta esto:
Código MySQL:
Ver original
  1.     table_name, constraint_name, TABLE_SCHEMA, constraint_type
  2.     information_schema.table_constraints
  3.     UPPER(table_name) = 'INVENTARIO';



La creación de índices es una decisión de diseño del sistema, y de análisis de performance.
Dependerá de las condiciones a cumplir en las diferentes consultas, saber si conviene o no crearlos. No existen reglas definidas para eso.

No pierdas tiempo en consideraciones irrelevantes al asunto a solucionar. Estás perdiendo el foco en el problema.

Simplemente ten en cuenta lo que el manual indica de las restricciones a la creacion de lso indices, y luego dedícate a analizar qué es lo que necesitas en aquellos momentos en que las consultas resultan con baja performance.
Este fue el resultado

table_name | constraint_name | TABLE_SCHEMA | constraint_type
inventario | PRIMARY | inventario_cajas | PRIMARY KEY
  #15 (permalink)  
Antiguo 03/06/2016, 11:43
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: Optimización de consultas MySql y PHP

Cita:
Iniciado por planmental Ver Mensaje
Este fue el resultado

table_name | constraint_name | TABLE_SCHEMA | constraint_type
inventario | PRIMARY | inventario_cajas | PRIMARY KEY
Pues según eso, el supuesto índice no existe...

Postea esto:

Código MySQL:
Ver original
  1. SHOW CREATE TABLE inventario;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 03/06/2016, 11:47
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Optimización de consultas MySql y PHP

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Pues según eso, el supuesto índice no existe...

Postea esto:

Código MySQL:
Ver original
  1. SHOW CREATE TABLE inventario;
Este fue el resultado:

Table | Create Table
inventario | CREATE TABLE `inventario` (`id_inventario` int(...
  #17 (permalink)  
Antiguo 03/06/2016, 12:13
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Optimización de consultas MySql y PHP

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Pues según eso, el supuesto índice no existe...

Postea esto:

Código MySQL:
Ver original
  1. SHOW CREATE TABLE inventario;

Perdón me falto cambiarle las opciones:

Código MySQL:
Ver original
  1. inventario
  2. CREATE TABLE `inventario` (
  3.  `id_inventario` int(11) NOT NULL AUTO_INCREMENT,
  4.  `actualizacion` date NOT NULL,
  5.  `caja` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  6.  `cliente` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  7.  `localidad` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  8.  `fecha_inicio` date NOT NULL,
  9.  `fecha_final` date NOT NULL,
  10.  `nota` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  11.  PRIMARY KEY (`id_inventario`),
  12.  KEY `caja` (`caja`)
  13. ) ENGINE=InnoDB AUTO_INCREMENT=1024 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Etiquetas: optimización, respuesta, tiempo
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 16:51.