mysql - 查询相当于临时表mysql

标签 mysql sql

我有下一个代码块,它的执行时间不超过 3 秒。

`CREATE TEMPORARY TABLE tmp
 SELECT
    MAX(date) as mdate
 FROM  table1
 WHERE
    date between "2017-03-13"
    and "2018-03-13"
    and client_id = "something"
    and field_id IN ("123","1234","12345")
GROUP BY DATE_FORMAT(date,'%x_%v');
SELECT 
    SUM(value),
    DATE_FORMAT(date,'%x_%v') as date
FROM 
  table1, tmp t
WHERE 
    date = t.mdate
and client_id = "something"
and field_id IN ("123","1234","12345")
GROUP BY date;
DROP TABLE tmp;`

但是当我尝试在一个查询中执行它时,它会在大约 1 分 4.36 秒内执行。

SELECT 
  SUM(value),
  mdates.grouping_date
FROM 
  (
     SELECT
       MAX(date) as mdate,
       DATE_FORMAT(a.date,'%x_%v') as grouping_date
     FROM  table1
     WHERE
        date between "2017-03-13"
        and "2018-03-13"
        and client_id = "something"
        and field_id IN ("123","1234","12345")
     GROUP BY grouping_date
) mdates, table1 a
WHERE 
   a.date = mdates.mdate
   and a.client_id = "something"
   and a.field_id IN ("123","1234","12345")
GROUP BY mdates.grouping_date;

我应该怎么做才能让它作为第一个 block 运行得更快?

我在想也许我可以使用复合索引,但我已经尝试过这个但没有帮助。

create index my_idx on table1(date,field_id,client_id);

更新:

解决我的问题的方法是创建几个索引。

create index index1 on table1(client_id,field_id,date)
create index index2 on table2(date,value)

现在它的运行速度与使用临时表的第一个查询一样快。

但我不得不稍微更改一下查询。

SELECT
   SUM(value),
   DATE_FORMAT(date,'%x_%v') as date
FROM 
   table1 a FORCE INDEX(index2)
WHERE
   a.date in (
     SELECT
      MAX(date)
     FROM
      table1 FORCE INDEX(index1)
     WHERE
      client_id = "something"
      and repo_id IN ("123","1234","12345")
      and date >= "2018-02-11" 
      and date < "2018-03-13"
     GROUP BY DATE_FORMAT(date,'%v_%x')
) 
GROUP BY date';

最佳答案

对于您的查询,我会将复合索引创建为:

create index my_idx on table1(client_id, field_id, date);

WHERE 条件 首先 在索引中,然后是其他条件。用于相等条件的列应该放在第一位。

关于mysql - 查询相当于临时表mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49542813/

相关文章:

mysql - 'group by' 适用于 MySQL,但不适用于 Oracle

javascript - 如何以图表的形式展示系统生成的结果

mysql - 在mysql中使用触发器将新记录插入表之前删除记录

sql - 尝试加入 Access 时出现语法错误

c# - 如何在linq中使用sql函数

mysql - 如何统计一个表记录被更新了多少次

mysql - SPATIAL 相对于使用标准边界框查询的优势

sql - 如何从服务主体登录名(这是 Azure SQL Server 的 AAD 管理员)创建服务主体 Azure SQL 数据库用户

mysql - 如何让我的 Teradata 查询提示输入 ?YYYYMMDD AND ?YYYYMMDD 和 之间的日期

sql - 从查询 SQL Server 中的每个日期获取第一个和最后一个日期时间