我已经使用此查询来显示我想要的结果。
它工作得很好,但我有一个问题。当数据库中的数据有数千条或记录时,它会变得更慢。我听说过数据按摩。
如果我修改数据,它的性能会更好吗?
<?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;
}
}
最佳答案
首先,您只需要转换一次日期,而不是在内部查询和外部查询中转换日期。
其次,您不需要重新聚合外部查询中的数据。
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;
不幸的是,没有明显的方法来添加索引来帮助此查询。如果您将每个表中的日期和时间拆分为两列,那么索引可以帮助查询。
关于php - 如何提高 MySQL 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29403776/