【问题标题】:MySQL Stored Procedure OptimizationMySQL 存储过程优化
【发布时间】:2017-04-23 08:46:30
【问题描述】:

我在 Mysql 中有以下存储过程。我的列必须是动态的,以便我将行转换为列。我有一个临时表来存储我需要的数据,然后我将行连接为带有 if 语句的列,但是我在 mysql 中出现内存不足错误。有什么方法可以优化我的查询以在 mysql workbench(64 位操作系统和 4gb 内存)中高效工作?

 DELIMITER $$
 CREATE DEFINER=`root`@`localhost`
         PROCEDURE `myWordDistributionsQueryAll`(OUT myOutput text)
 BEGIN
  CREATE TEMPORARY TABLE IF NOT EXISTS tmpWeightTable
           (INDEX(word,topicName) ) ENGINE=MyISAM 
    AS  (

        SELECT wwt.topicName, t.topic_cnt as sumOfWordsInTopic,
               wwt.word, wwt.wordCount,
               (wwt.wordCount / t.topic_cnt) AS wordProbability
         FROM weightallofwordsintopic as wwt JOIN
             (SELECT topicName, sum(wordCount) AS topic_cnt
              FROM weightallofwordsintopic 
              GROUP BY topicName 
            ) t
         ON wwt.topicName = t.topicName
    );

    SET @sql = '';
    SELECT @sql := CONCAT(@sql,if(@sql='','',', '),temp.output)
    FROM
    (
        SELECT
          DISTINCT
            CONCAT(
             'SUM(IF(word = ''',
              word,
              ''', wordProbability, 0)) AS ',
              word
            ) as output
        FROM
            tmpWeightTable 
    ) as temp;


    SET @sql = CONCAT('SELECT topicName, ', @sql, ' FROM tmpWeightTable
          group by topicName order by topicName asc');
    SET myOutput=@sql;           
    END$$
    DELIMITER ;

表:

CREATE TABLE weightallofwordsintopic (
    topicName varchar(200) DEFAULT NULL, 
    word varchar(100) DEFAULT NULL, 
    wordCount int(11) DEFAULT NULL, 
    KEY topicName_index (topicName), 
    KEY word_index (word)
) ENGINE=InnoDB DEFAULT CHARSET=latin5

【问题讨论】:

  • 多少行?请提供SHOW CREATE TABLE weightallofwordsintopicGROUP_CONCAT() 不会更容易吗?
  • 您好@RickJames 感谢您的关注,创建表脚本如下 CREATE TABLE weightallofwordsintopic (topicName varchar(200) DEFAULT NULL, word varchar(100) DEFAULT NULL, wordCount int(11) 默认 NULL,KEY topicName_index (topicName),KEY word_index (word) ENGINE=InnoDB DEFAULT CHARSET=latin5;行数太大,可能是 500k,但是当我转换为行时,我使它变得不同。

标签: mysql stored-procedures out-of-memory query-optimization


【解决方案1】:

SELECT @sql 中的“派生”表不应该是

( SELECT CONCAT(
             SUM(...), ...
             word
         ) AS output
    FROM tmpWeightTable
    GROUP BY word )

这将进行分组,这似乎是以前缺少的。

但可能还有另一个问题。那需要在里面

SELECT @list := GROUP_CONCAT(",", item)
    FROM ( SELECT 
                CONCAT("'", word,":", SUM(wordProbability), "'") AS item
            FROM tmpWeightTable
            GROUP BY word
          ) AS z;

然后把sql和

SELECT @sql := CONCAT('SELECT topicName, ', @list, 
      ' FROM ??  group by topicName order by topicName asc');

我迷路了...请提供每个阶段的示例字符串。

【讨论】:

  • 您好,内查询是什么意思,是哪一个?
  • 每个主题的总和是不同的,所以我无法通过单词分组来求和概率
  • 请显示示例输入和输出,仅包含少量主题和单词。
  • 假设我的表中有这条记录,第一个 col 是 topicName,第二个是 word,第三个是 wordcount。所以概率是 wordCount 除以该主题中的单词总和。 20160610-20160611 T0 başkan 318 20160610-20160611 T0 cenaze 254 20160610-20160611 T0 adam 247 20160610-20160611 T0 türk 188 20160610-20160611 T0 şehit 182 20160610-20160611 T1 üniversite 240 20160610-20160611 T1 okul 150 20160610-20160611 T1 çalış 145 20160610- 20160611 T1 最终 144 20160610-20160611 T1 sınav 140
  • 我不可能安装其中的任何东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 2012-02-26
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多