2015-04-02 28 views
0

我已經使用此查詢來顯示我想要的結果。如何加快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; 
    } 
} 
+0

,如果你能格式化查詢更好,所以它並不需要水平滾動,那簡直太好了。同樣,show的結果在每個表上創建表,並且查詢解釋計劃的結果將會有所幫助。 – 2015-04-02 02:03:26

+0

爲什麼您要將日期列轉換爲Date |?無疑它是一個DATE或DATETIME列。日期也是一個保留字,並且不能用於列名。它仍然有效的事實是出於向後兼容性的原因,它並不適合。在任何語言中,畢竟有足夠的詞語不必使用保留詞。 Desides是幾號?出生日期,創建日期,預訂日期或什麼。使用一個意思是somethng的名字。 – 2015-04-02 02:12:38

+0

日期數據類型是datatime。 – 2015-04-02 02:16:21

回答

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; 

不幸的是,沒有明顯的方法來添加索引來幫助查詢。如果在每個表中將日期和時間分成兩列,則索引可以幫助查詢。

+0

是提高性能的唯一方法嗎?通過拆分列日期和時間 – 2015-04-02 02:30:07

+0

@SyahmiRoslan。 。 。考慮到你在時間部分的條件以及在日期之前的聚合,我所能想到的就是這些。 – 2015-04-02 02:36:55

+0

好的,謝謝你的幫助。我很感激。 – 2015-04-02 02:38:09