mysql - 是否可以优化这个MySql查询

标签 mysql sql query-optimization

我正在寻找一种方法来优化以下 MySQL 存储过程:

  DECLARE total BIGINT UNSIGNED;

  DROP TEMPORARY TABLE IF EXISTS tempTable; 
  CREATE TEMPORARY TABLE tempTable(identityValue BIGINT(20) UNSIGNED );

  INSERT INTO tempTable
  SELECT 
    `getIdentity`(samples.`originalId`) 
  FROM 
      `rawData` 
  WHERE 
    `samples`.`groupId` = _group;


  SET total = (

    SELECT 
        IFNULL( SUM(getTotal(rawData.id, NULL, NULL)), 0)

    FROM 
        rawData

    WHERE 
        rawData.user= _user AND
        getIdentity(rawData.id) IN (SELECT * FROM tempTable)

    );


  DROP TEMPORARY TABLE IF EXISTS tempTable; 

  RETURN total;

getIdentity 函数如下所示:

RETURN (SELECT IFNULL(MIN(id1), _id)
             FROM `equivalences` WHERE 
             id1 = _id OR id2 = _id);

getTotal 函数如下所示:

BEGIN
    DECLARE total INT;

    IF (_startDate IS NULL OR _endDate IS NULL) THEN

        SET total = (SELECT IFNULL(SUM(ops.downloads),0) 
                     FROM objects, ops
                     WHERE objects.id = _objectId AND ops.objectId = _objectId);
    ELSE 
        SET total = (SELECT IFNULL(SUM(ops.downloads),0) 
                     FROM objects, ops
                     WHERE objects.id = _objectId AND ops.objectId = _objectId AND 
                           ops.`date` BETWEEN _startDate AND _endDate);
    END IF;

    RETURN total;
END

现在运行大约需要 350 毫秒。大多数时间似乎与我正在创建的临时表有关。使用 EXPLAIN 后,这些表已经有了我认为必要的索引。

最佳答案

我猜你没有将内存用于临时表。尝试一下

CREATE TEMPORARY TABLE tempTable(identityValue BIGINT(20) UNSIGNED ) engine=memory;

对于 mysql >= 5.6,您可以在配置中设置 default_tmp_storage_engine=MEMORY 使其成为永久选项。

由于您已经拥有良好的索引,因此分析查询其余部分的优化是否有意义,取决于临时表中的数据量。

关于mysql - 是否可以优化这个MySql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37648132/

相关文章:

MySQL:根据指定条件排除某些结果

mysql - SQL : Conditional result used in the same conditional outputs

当 NVARCHAR 有换行符时,使用 SQL 语句的 Javascript 代码不起作用

mysql - 在 SQL 中排名时, "+"符号是什么意思?

mysql - 针对 max、count 优化 MySQL InnoDB 查询

php - 如何只插入相同日期的条目不超过4条?

php - 最后插入 id 的方法可靠吗

php - 如何在 PHP 7 中启用 MySQLi 扩展?

php - 如何获取所选数据列表的 ID

mysql查询对于不连续数据运行太慢