![](/img/trans.png)
[英]MYSQL Update query using a temporary table when an equivalent select query does not
[英]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.