mysql - 使用存储的查询搜索大(600 万)行 MySQL?

标签 mysql highcharts

我有一个包含大约 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/

相关文章:

jquery - 在 Highcharts 中用垂直线连接两个不同的值

javascript - 如何使 Highstocks 的 x 轴均匀且规则?

PHP搜索查询MYSQL

php - 根据 2 列中的数据插入或更新行 - 1 个主列和 1 个唯一列

javascript - 如何将数据表添加到动态生成的 Highcharts 中

javascript - Highcharts AreaSpline - 在图表和绘图区域之间添加填充

javascript - Highcharts:是否可以绘制没有数据值的旭日图?

MySQL 从 n 中随机选择 m

php - foreach 循环内的 Mysqli_query

mysql - INSERT INTO 语句 目标表中存在的所有列