Pregunta

siguiente problema me está dando un dolor de cabeza.

He creado mi servidor MySQL para su uso "Consulta Chaching".

set global query_cache_size = 10000000;

parece que mi caché de consultas funciona porque la salida de

SHOW STATUS LIKE 'Qcache%';  

como se sigue

+-------------------------+----------+    
|    Variable_name        | Value    |           
+-------------------------+----------+     
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 47223976 |
| Qcache_hits             | 6709     |                                       
| Qcache_inserts          | 2314     |                                    
| Qcache_lowmem_prunes    | 0        |                                  
| Qcache_not_cached       | 365      |                                  
| Qcache_queries_in_cache | 441      |                                   
| Qcache_total_blocks     | 960      |                                     
+-------------------------+----------+ 

pero, nevertheles la siguiente (consulta compleja, con selecciona interiores etc.) no recibe caché.

alsways toma al menos 0,8 segundos para recuperar los datos de la consulta. ¿Cómo puedo traer a mysql guardar los resultados de esta consulta en su caché

He intentado eliminar los ot selecciona interiores pero esto no hizo un differnence.

SELECT p.id
   AS
   project_id,
   p.code
   AS project_code,
   p.title
   AS project_title,
   p.start_date
   AS project_start_date,
   p.end_date
   AS project_end_date,
   p.modf
   AS project_modf,
   ( p.budget * (SELECT 1 / r.VALUE
                 FROM   exchange_rates r
                 WHERE  r.class_currency_id = p.class_budget_currency_id) )
   AS
   project_budget,
   (SELECT z.txt
    FROM   sys_labels z
    WHERE  z.id = ps.value_label_id
           AND z.lng = 'en')
   AS project_status,
   (SELECT z.txt
    FROM   sys_labels z
    WHERE  z.id = ps.data_label_id
           AND z.lng = 'en')
   AS project_color,
   GROUP_CONCAT(DISTINCT pt.class_topic_id)
   AS projects_thematic_area_ids,
   u.id
   AS project_owner_id
FROM   projects AS p
   LEFT JOIN projects_thematic_areas AS pt
     ON pt.project_id = p.id
   LEFT JOIN sys_users AS u
     ON u.id = p.owner_uid
   LEFT JOIN class_data s
     ON s.id = p.class_status_id
   LEFT JOIN class_data AS ps
     ON ps.id = s.id
   LEFT JOIN sys_labels AS prdz1
     ON prdz1.id = prd.value_label_id
        AND prdz1.lng = 'en'
   LEFT JOIN sys_labels AS prdz2
     ON prdz2.id = prd.data_label_id
        AND prdz2.lng = 'en'
   LEFT JOIN projects_locations AS pl
     ON pl.project_id = p.id
   LEFT JOIN class_data AS l
     ON l.id = pl.class_location_id
   LEFT JOIN class_data AS r
     ON r._lft <= l._lft
        AND r._rgt >= l._rgt
        AND r._level = 1
        AND r.class_id = 5
   LEFT JOIN class_data AS c
     ON c._lft <= l._lft
        AND c._rgt >= l._rgt
        AND c._level = 2
        AND c.class_id = 10
   LEFT JOIN projects_donors AS pd
     ON pd.project_id = p.id
   LEFT JOIN institutions AS i
     ON pd.inst_id = i.id
   LEFT JOIN class_data AS ic
     ON ic.id = i.class_country_id
   LEFT JOIN projects_deliverables AS d
     ON d.project_id = p.id
WHERE  1 = 1
   AND p.is_del = "f"
   AND p.is_active = "t"
GROUP  BY p.id
ORDER  BY p.modf DESC,
      p.code DESC 

Cualquier ayuda apprechiated ....

Regards

J.

¿Fue útil?

Solución

Además de las respuestas anteriores:. La caché de consultas no se puede utilizar incluso si la consulta es allí si hay cambios en cualquiera de las tablas seleccionadas

Pero ¿por qué unirse a Al esas tablas cuando no está seleccionando nada de ellos? También probablemente no debería sub-select nada si puede unirse a él.

Algo como esto sería seleccionar exactamente el mismo:

SELECT
   p.id AS project_id,
   p.code AS project_code,
   p.title AS project_title,
   p.start_date AS project_start_date,
   p.end_date AS project_end_date,
   p.modf AS project_modf,
   p.budget * (1 / r.VALUE) AS project_budget,
   z1.txt AS project_status,
   z2.txt AS project_color,
   GROUP_CONCAT(DISTINCT pt.class_topic_id) AS projects_thematic_area_ids,
   u.id AS project_owner_id
FROM
   projects AS p
   LEFT JOIN projects_thematic_areas AS pt ON pt.project_id = p.id
   LEFT JOIN sys_users AS u ON u.id = p.owner_uid
   LEFT JOIN exchange_rates AS r ON r.class_currency_id = p.class_budget_currency_id
   LEFT JOIN class_data s ON s.id = p.class_status_id
   LEFT JOIN class_data AS ps ON ps.id = s.id
   LEFT JOIN sys_labels AS z1 ON z1.id = ps.value_label_id AND z1.lng = 'en'
   LEFT JOIN sys_labels AS z2 ON z2.id = ps.data_label_id AND z2.lng = 'en'
WHERE
   1
   AND p.is_del = "f"
   AND p.is_active = "t"
GROUP  BY
   p.id
ORDER  BY
   p.modf DESC,
   p.code DESC 

Por supuesto que tiene (combinada) índices en todas las claves externas, donde los campos y campos de grupo. Considere el uso de un tinyint o campo de enumeración de sus valores booleanos. También es posible que desee considerar la posibilidad de que la selección no GROUP_CONCAT para que pueda bajar el GROUP BY. Y tal vez utilizando INNER JOIN en lugar de LEFT JOIN si está seguro de la relación existe.

Otros consejos

Se puede tratar SELECT SQL_CACHE ... FROM ...

Algunas cosas básicas que usted puede intentar:

  • caché de consultas de documentación para asegurarse de entender los conceptos básicos y tienen la configuración correctamente.
  • Lo ideal sería aislar el servidor de base de datos MySQL por lo que sólo se está ejecutando los comandos que se está dando. Si no puede hacer esto, entonces trate de configurar y ejecutar pruebas en otra máquina.
  • Ejecutar una consulta simple y vistazo a las variables de estado y Qcache_hits Com_select para determinar si el caché de consulta está siendo golpeado o no.
  • Haga su consulta compleja y controlar los mismos valores. Si la consulta no está afectando a la caché a continuación, tratar de partes más pequeñas hasta que encuentre lo que está provocando que no obtienen en caché. Si se almacena en caché, entonces el problema puede deberse a cualquiera de las tablas de la consulta que se actualiza entre consultas, que pudieran invalidar la copia en caché.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top