如何加快MySQL的性能

时间:2015-04-02 01:55:48

标签: php mysql

我使用此查询来显示我想要的结果。

它完美无缺,但我有一个问题。当数据库中的数据有数千或记录时,它变慢。我听说过数据按摩。

如果按摩数据可以表现得更好吗?

<?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;
    }
}

2 个答案:

答案 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_建议。

https://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

How do I add indices to MySQL tables?