MySQL查询缓存,复杂SQL查询
下面的问题让我头疼 我已经将MySQL服务器设置为使用查询查询查询MySQL查询缓存,复杂SQL查询,mysql,cache-control,Mysql,Cache Control,下面的问题让我头疼 我已经将MySQL服务器设置为使用查询查询查询 set global query_cache_size = 10000000; 我的查询缓存似乎可以工作,因为 SHOW STATUS LIKE 'Qcache%'; 详情如下: +-------------------------+----------+ | Variable_name | Value | +-------------------------+--
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.您可以尝试选择SQL\u缓存。。。从…除前面的答案外:如果所选表中有任何更改,则即使查询在其中,也不会使用查询缓存 但是,当你没有从这些表格中选择任何内容时,为什么要加入这些表格呢?此外,如果您可以加入,您可能不应该再选择任何内容 类似这样的内容将选择完全相同的:
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
当然,您已经在所有外键上组合了索引,其中包括字段和组字段。考虑使用TyyIn或EnUM字段用于布尔值。您可能还想考虑不选择GROMPK-CONTAT,这样您就可以丢失该组。如果确定存在这种关系,也许可以使用内部联接而不是左联接。您可以尝试一些基本的方法: 阅读以确保您了解基本知识并正确设置。 理想情况下,隔离MySQL数据库服务器,使其只运行您给它的命令。如果无法执行此操作,请尝试在另一台计算机上设置并运行测试。 运行一个简单的查询并查看Qcache_hits和Com_select状态变量,以确定查询缓存是否被命中。 尝试复杂的查询并监视相同的值。如果您的查询没有命中缓存,请尝试较小的部分,直到找到导致它无法缓存的原因。如果正在缓存,则问题可能是由于查询中的任何表在查询之间被更新,这将使缓存的副本无效。