2015-04-02 85 views
1

我有這樣的MySQL查詢這我加載到我家控制器和運行後,笨的$searchterm = $this->search_model->searchterm_handler($this->input->get_post('searchterm', TRUE));
我得到的0.7110如何提高Codeigniter中的MySQL查詢性能?

查詢的執行時間我的模型裏面:

<?php 
class Search_Model extends CI_Model 

    public function search($searchterm,$limit) 
     { 
      $sql = "SELECT cast(s.req_date as Date) as Date, SUM(s.sTransaction)+SUM(r.rTransaction) as SUMt, SUM(s.sSuccess)+ SUM(r.rSuccess) as SUMs, s.sTransaction, r.rTransaction, s.sSuccess, r.rSuccess 
        FROM 
        (SELECT s.req_date, COUNT(*) as sTransaction, SUM(s.status = 0) as sSuccess 
        FROM transaction_log_ats_201503 as s WHERE cast(s.req_date as time) BETWEEN '00:00:00' AND '$searchterm' 
        GROUP BY cast(req_date as Date) desc) as s 
        JOIN 
        (SELECT r.req_date, COUNT(*) as rTransaction, SUM(r.status = 0) as rSuccess 
        FROM transaction_log_atr_201503 as r WHERE cast(r.req_date as time) BETWEEN '00:00:00' AND '$searchterm' 
        GROUP BY cast(req_date as Date) desc) as r 
        ON cast(s.req_date as date)=cast(r.req_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; 
      } 
      else 
      { 
       return 0; 
      } 
     } 
?> 

有什麼提高查詢性能的可靠方法?

謝謝。

+0

您將需要重新設計您的查詢,以便它不使用嵌套的select語句並僅依賴連接。然後,您需要將索引添加到您用於連接的字段中。 – 2015-04-02 15:37:44

+0

你能告訴我如何在這種情況下使用INDEX嗎?謝謝 – 2015-04-09 03:00:48

+0

不知道你的表結構。首先是重新設計你的查詢來擺脫嵌套的select語句。它可能會更好地執行,如果你把它分成幾個查詢,並在php中關聯數據。索引是一個廣泛的主題,但沒有那麼複雜的概念。做一些閱讀你會發現很多關於這個主題的教程 – 2015-04-09 08:12:32

回答

0

我想你錯過了一個「)」。

爲什麼在子查詢中有DESC;它不能控制任何有用的東西。

MySQL(直到5.6)無法優化 FROM (SELECT ...) JOIN (SELECT ...) ON ... 沒有索引,所以它在tmp表上進行全表掃描,因此速度很慢。

可能的解決方案:

  • 升級到5.6。
  • 將其中一個子查詢放入TEMPORARY表中,並在reg_date上爲其指定INDEX。
+0

如何在MYSQL中使用INDEX?我不明白INDEX函數..我已閱讀有關INDEX函數,但我不完全理解。 – 2015-04-02 08:13:30

+0

重大話題。 'INDEX'不是一個「功能」;它是一個表的屬性。這對性能非常重要。設想成爲一名職員並擁有一千張紙(每人一份簡歷/應用程序等),並需要從我那裏找到紙張。現在想象一下按照字母順序排列整齊。這是INDEX的區別。 – 2015-04-02 22:01:05