我使用此查询来显示我想要的结果。
它完美无缺,但我有一个问题。当数据库中的数据有数千或记录时,它变慢。我听说过数据按摩。
如果按摩数据可以表现得更好吗?
<?php
public function search($searchterm)
{
$sql = "
SELECT
CAST(t.date as Date) AS Date,
SUM(t.Transaction)+SUM(r.Request) AS allTransaction,
SUM(t.Success)+SUM(r.RequestSuccess) AS allSuccess,
t.Transaction,
t.Success,
r.Request,
r.RequestSuccess
FROM
(
SELECT
date,
COUNT(DISTINCT no_a) AS Transaction,
SUM(t.status = 0) AS Success
FROM
transfer_tx_201503 AS t
WHERE
CAST(t.date as time) BETWEEN '00:00:00' AND '$searchterm'
GROUP BY CAST(date as Date) DESC
) AS t
JOIN
(
SELECT
date,
COUNT(DISTINCT no_a) AS Request,
SUM(r.status = 0) AS RequestSuccess
FROM
request_tx_201503 AS r
WHERE
CAST(r.date as time) BETWEEN '00:00:00' AND '$searchterm'
GROUP BY CAST(date as Date) DESC
) AS r
ON
CAST(t.date as date) = CAST(r.date as date)
GROUP BY
Date
DESC";
$q = $this->db->query($sql);
if($q->num_rows() > 0)
{
foreach($q->result() as $row)
{
$data[] = $row;
}
return $data;
}
}
答案 0 :(得分:1)
首先,您只需要将日期转换为一次而不是内部外部查询。
其次,您不需要在外部查询中重新聚合数据。
SELECT t.date as Date,
(t.Transaction + r.Request) as allTransaction,
(t.Success + r.RequestSuccess) as allSuccess,
t.Transaction, t.Success, r.Request, r.RequestSuccess
FROM (select CAST(date as Date) as date, count(DISTINCT no_a) as Transaction,
sum(t.status = 0) as Success
from transfer_tx_201503 t
WHERE CAST(t.date as time) BETWEEN '00:00:00' AND '$searchterm'
group by CAST(date as Date) desc
) t JOIN
(select CAST(date as Date) as date, count(DISTINCT no_a) as Request,
SUM(r.status = 0) as RequestSuccess
from request_tx_201503 r
where CAST(r.date as time) BETWEEN '00:00:00' AND '$searchterm'
group by CAST(date as Date) desc
) r
ON t.date = r.date
GROUP BY Date desc;
不幸的是,没有一种明显的方法可以添加索引来帮助查询。如果将日期和时间拆分为每个表中的两列,则索引可以帮助查询。
答案 1 :(得分:0)
看起来你需要在你的mysql数据库表上添加一些索引,可能在你的日期列上。我需要从数据库表中看到模式以帮助更多。此外,查询的“解释”结果将有助于pala_建议。