从mysql数据生成直方图

时间:2012-08-18 01:25:09

标签: mysql sql histogram

我想知道是否有人对我的直方图生成查询有一些建议。我有一个我喜欢的查询(因为它有效),但它非常慢。这是背景:

我有一个元数据表,一个数据值表,其中meta_data中的一行是data_values中许多(可能是几千)行的键行,以及一个直方图bin信息表:

create table meta_data (
    id int not null primary key, 
    name varchar(100), 
    other_data char(10)
);
create table data_values (
    id int not null primary key, 
    meta_data_id int not null, 
    data_value real
);
create table histogram_bins (
    id int not null primary key,
    bin_min real,
    bin_max real,
    bin_center real,
    bin_size real
);

创建直方图的查询:

SELECT md.name AS `Name`, 
       md.other_data AS `OtherData`, 
       hist.bin_center AS `Bin`, 
       SUM(data.data_value BETWEEN hist.bin_min AND hist.bin_max) AS `Frequency`
FROM   histogram_bins hist 
       LEFT JOIN data_values data ON 1 = 1 
       LEFT JOIN meta_data md ON md.id = data.meta_data_id

GROUP BY md.id, `Bin`;

在此查询的早期版本中,BETWEEN ... AND逻辑语句在JOIN中失效(替换1 = 1),但之后我只会收到非零频率的直方图行。为了分析目的,我需要所有箱子的行(甚至是零频率箱子)。

它非常慢,达到10-15分钟左右。 data_values表有大约790万行,meta_data的重量为15,900行 - 所以可能只需要很长时间!

非常感谢!

1 个答案:

答案 0 :(得分:0)

我认为这可能会有所帮助

SELECT h.bin_center AS `Bin`, 
   ISNULL(F.Frequency,0) AS `Frequency`
FROM  histogram_bins h
LEFT JOIN 
   (SELECT hist.bin_center AS `Bin`, 
           COUNT(data_values) AS `Frequency`
    FROM data_values  data
    LEFT JOIN histogram_bins hist ON data.data_value BETWEEN hist.bin_min AND hist.bin_max        
    GROUP BY md.name, md.other_data, hist.bin_center) F ON F.bin_center = h.bin_center

我更改了表格的顺序,因为我认为最好为数据中的每条记录找到相应的bin,然后计算按bin分组的数量