我有下一个代码块,该代码在不超过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;