簡體   English   中英

查詢等同於臨時表mysql

[英]Query equivalent to temporary table mysql

我有下一個代碼塊,將在不超過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;

為了使它作為第一個程序塊運行得更快,我應該怎么做?

我在想也許我可以使用復合索引,但是我已經嘗試過使用該索引但沒有幫助。

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條件首先在索引中,然后是其他條件。 用於相等條件的列應在第一位。

您可以使用一個查詢

 SELECT
        DATE_FORMAT(MAX(date),'%x_%v') as date 
        , SUM(value)
     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');

無論如何,您應該使用日期,client_id,field_id的復合索引

嘗試將其分解為兩個查詢,如下所示:
還擺脫通配符(%)以提高性能

SELECT
           MAX(date) as mdate,
           DATE_FORMAT(a.date,'%x_%v') as grouping_date
    into #mdates
         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



    SELECT 
      SUM(value),
      mdates.grouping_date
    FROM 
       #mdates 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;

您嘗試過CTE嗎?

WITH DateM AS 
  (
     SELECT
     Client_ID,
       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 client_id, grouping_date
)



SELECT 
  SUM(value),
  datem.grouping_date
FROM table1 join DateM on table1.client_id = DateM.Client_ID
and table1.date = datem.mdate
GROUP BY datem.grouping_date;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM