php - 如何提高 MySQL 的性能

标签 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;
    }
}

最佳答案

首先,您只需要转换一次日期,而不是在内部查询和外部查询中转换日期。

其次,您不需要重新聚合外部查询中的数据。

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/

相关文章:

php - 处理 innoDB 死锁

mysql - 将 MySQL 表文本值拆分为多行

mysql - 在 MySQL 中寻找合作

MySQL NULL 行存储大小

mysql - 注释导致 MySQL 脚本出错

mysql - 如何让mysql返回看涨值最高的行?

php - 使用 protected $dates 格式化日期 laravel

C# Linq 比 PHP 慢?解决谜题#236A

javascript - 从 PHP 脚本调用 Node

php - 如何使用 eloquent/fluent 从单个查询中插入多行