我有一个包含大约 600 万个条目的数据库 - 并且还会增加 - 我在其中运行查询以返回 HighCharts 图表功能。我需要多年纵向阅读,所以我正在运行这样的查询:
foreach($states as $state_id) { //php code
SELECT //mysql psuedocode
sum(case when mydatabase.Year = '2003' then 1 else 0 end) Year_2003,
sum(case when mydatabase.Year = '2004' then 1 else 0 end) Year_2004,
sum(case when mydatabase.Year = '2005' then 1 else 0 end) Year_2005,
sum(case when mydatabase.Year = '2006' then 1 else 0 end) Year_2006,
sum(case when mydatabase.Year = '2007' then 1 else 0 end) Year_2007,
sum(case when mydatabase.Year = '$more_years' then 1 else 0 end) Year_$whatever_year,
FROM mytable
WHERE State='$state_id'
AND Sex IN (0,1)
AND Age_segment IN (5,4,3,2,1)
AND "other_filters IN (etc, etc, etc)
} //end php code
但是对于不同的状态一次...所以返回让我们说 5 个状态,每个状态都有上面的语句,但是一个状态 ID 被替换了。同时,年份可以是任意年数,性别(男性/女性/其他)和年龄段以及其他修饰符会根据过滤器不断变化。查询很长(至少 30-40 秒)。所以我有一个想法——除非我完全做错了——是将上面的查询与结果实际存储在第二个表中,然后首先检查“元查询”并查看它是否被“缓存”然后返回没有读取数据库的结果(不会经常更新)。
这是一个好方法还是存在我没有发现的潜在问题?
编辑:更改为表,而不是数据库(duh)。
表结构为:
id | Year | Sex | Age_segment | Another_filter | Etc
没有比这更复杂的了,没有加入任何其他东西。现在有 id、Year、Sex 和 Age_segment 键。
最佳答案
适当的索引是加速查询所需要的。首先对查询执行“EXPLAIN”并在此处发布结果。
我建议从以下开始。这种方式避免了 for 循环并在 1 个查询中返回数据。不知道行数和每列的基数,我建议使用 State 和 Year 的复合索引。
SELECT mytable.State,mytable.Year,count(*)
FROM mytable
AND Sex IN (0,1)
AND Age_segment IN (5,4,3,2,1)
AND "other_filters IN (etc, etc, etc)
GROUP BY mytable.State,mytable.Year
可以通过检查某些列的基数来进一步优化上述查询。运行以下命令以获取基数:
SELECT Age_segment FROM mytable GROUP BY Age_segment;
关于mysql - 使用存储的查询搜索大(600 万)行 MySQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39192783/