[英]MySQL query cache, complex SQL query
接下来的问题让我头疼。
我已经将MySQL服务器设置为使用“查询缓存”。
set global query_cache_size = 10000000;
看来我的查询缓存有效,因为
SHOW STATUS LIKE 'Qcache%';
如下
+-------------------------+----------+
| 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 |
+-------------------------+----------+
但是,无论如何,以下内容(复杂查询,内部选择等)不会被缓存。
始终需要至少0.8秒才能检索此查询的数据。 我如何带mysql将查询结果存储在缓存中 ?
我试着删除内部选择,但这并没有什么区别。
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
任何帮助感激....
问候
J.
除以前的答案外:即使所选表中有任何更改,即使查询在其中,也不会使用查询缓存。
但是,当您没有从表中选择任何内容时,为什么还要加入这些表呢? 另外,如果可以加入,您可能不应该子选择任何内容。
这样的选择将完全相同:
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
当然,您在所有外键(字段和组字段)上都有(组合)索引。 考虑为布尔值使用tinyint或枚举字段。 您可能还需要考虑不要选择该GROUP_CONCAT,这样您可能会丢失GROUP BY。 如果您确定该关系存在,则可以使用INNER JOIN而不是LEFT JOIN。
您可以尝试SELECT SQL_CACHE ... FROM ...
您可以尝试一些基本操作:
Qcache_hits
和Com_select
状态变量,以确定是否命中了查询缓存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.