从mysql数据生成直方图

从mysql数据生成直方图,mysql,sql,histogram,Mysql,Sql,Histogram,我想知道是否有人对生成直方图的查询有什么建议。我有一个我喜欢的查询(因为它可以工作),但是它非常慢。背景如下: 我有一个元数据表,一个数据值表,其中元数据中的一行是数据值中许多(可能几千)行的关键行,还有一个直方图信息表: create table meta_data ( id int not null primary key, name varchar(100), other_data char(10) ); create table data_values (

我想知道是否有人对生成直方图的查询有什么建议。我有一个我喜欢的查询(因为它可以工作),但是它非常慢。背景如下:

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

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`;
在此查询的早期版本中,介于。。。逻辑语句在连接中被关闭(替换为1=1),但我将只接收非零频率的直方图行。出于分析目的,我需要所有存储箱的行(即使是零频率的存储箱)

它非常慢,大约10-15分钟。data_values表有大约790万行,meta_数据有15900行,所以可能需要很长时间


非常感谢

我想这可能会有帮助

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分组的数量

我认为您试图做的是
左外部联接
(使用原始条件)而带有
1=1
LEFT JOIN
的输出是表
直方图
数据
的笛卡尔乘积。这也可以解释执行缓慢的原因。我认为你是对的,非常感谢。可能是Hi的重复,非常感谢你的建议。我认为,如果只有一个数据集(一个直方图),这将很好地工作。在实时版本中,输出包含许多数据集的柱状图,因此每个数据集都需要零bin行——也许这就是笛卡尔积(如上所述)工作的原因,但速度太慢了。