当记录非常庞大时,Mysql列作为行(透视表)的查询速度非常慢

当记录非常庞大时,Mysql列作为行(透视表)的查询速度非常慢,mysql,performance,dynamic,pivot,Mysql,Performance,Dynamic,Pivot,我正试图编写一个查询来创建一个数据“表”,如下所示: SELECT cs.`category_id`, cs.`ProcessDate`, cs.`PercentChange` FROM `Category_Statistics` cs WHERE cs.`ProcessDate` >= '2011-05-10' AND cs.`ProcessDate` <= '2011-05-14' 现在我希望结果是这样的(来自MySQL查询,而不是由应用程序操纵): 我必须查询以生

我正试图编写一个查询来创建一个数据“表”,如下所示:

SELECT cs.`category_id`, cs.`ProcessDate`, cs.`PercentChange`
  FROM `Category_Statistics` cs
 WHERE cs.`ProcessDate` >= '2011-05-10'
   AND cs.`ProcessDate` <= '2011-05-14'
现在我希望结果是这样的(来自MySQL查询,而不是由应用程序操纵):

我必须查询以生成上述结果。这是我的问题

SELECT `CategoryId`,
   MAX(IF(c.`ProcessedOn` = '2011-04-20', c.`PercentChange`, NULL)) AS '2011-04-20',
   MAX(IF(c.`ProcessedOn` = '2011-04-21', c.`PercentChange`, NULL)) AS '2011-04-21',
   MAX(IF(c.`ProcessedOn` = '2011-04-22', c.`PercentChange`, NULL)) AS '2011-04-22',
   MAX(IF(c.`ProcessedOn` = '2011-04-23', c.`PercentChange`, NULL)) AS '2011-04-23',
   MAX(IF(c.`ProcessedOn` = '2011-04-24', c.`PercentChange`, NULL)) AS '2011-04-24'
  FROM `Category_Gravity` c
 WHERE c.`ProcessedOn` >= '2011-04-20'
   AND c.`ProcessedOn` <= '2011-04-24'
 GROUP BY `CategoryId`
选择'CategoryId`,
最大值(如果(c.`ProcessedOn`='2011-04-20',c.`PercentChange`,NULL))为'2011-04-20',
最大值(如果(c.`ProcessedOn`='2011-04-21',c.`PercentChange`,NULL))为'2011-04-21',
最大值(如果(c.`ProcessedOn`='2011-04-22',c.`PercentChange`,NULL))为'2011-04-22',
最大值(如果(c.`ProcessedOn`='2011-04-23',c.`PercentChange`,NULL))为'2011-04-23',
最大值(如果(c.`ProcessedOn`='2011-04-24',c.`PercentChange`,NULL))为'2011-04-24'
摘自`类别` c
其中c.`ProcessedOn`>='2011-04-20'
和c.“加工过的”`
CategoryId    | 2011-05-10 | 2011-05-11 | 2011-05-12 | 2011-05-13 | 2011-05-14 |
--------------------------------------------------------------------------------
category_4    |     10     |     18     |     12     |      9     |      14    |
category_7    |     21     |      7     |     16     |      14    |      13    |
categeory_12  |      7     |     15     |     11     |      19    |       8    |
--------------------------------------------------------------------------------
SELECT `CategoryId`,
   MAX(IF(c.`ProcessedOn` = '2011-04-20', c.`PercentChange`, NULL)) AS '2011-04-20',
   MAX(IF(c.`ProcessedOn` = '2011-04-21', c.`PercentChange`, NULL)) AS '2011-04-21',
   MAX(IF(c.`ProcessedOn` = '2011-04-22', c.`PercentChange`, NULL)) AS '2011-04-22',
   MAX(IF(c.`ProcessedOn` = '2011-04-23', c.`PercentChange`, NULL)) AS '2011-04-23',
   MAX(IF(c.`ProcessedOn` = '2011-04-24', c.`PercentChange`, NULL)) AS '2011-04-24'
  FROM `Category_Gravity` c
 WHERE c.`ProcessedOn` >= '2011-04-20'
   AND c.`ProcessedOn` <= '2011-04-24'
 GROUP BY `CategoryId`