我正在尝试将慢查询日志记录实现到我的数据库类中,但我得到了奇怪的结果。 它目前“主要”记录所有查询,并且它表示大多数查询运行大约需要0.8秒,我不明白,因为这是在我的开发人员计算机上,并没有负载过重。

地狱,我甚至尝试在phpMyAdmin中运行查询,它们在那里非常快。

我把它放在了错误的地方吗? 还是我错过了什么?

class database {
    protected $_mysqli;
    protected $_debug;

    public function __construct($host, $username, $password, $database, $debug) {
        $this->_mysqli = new mysqli($host, $username, $password, $database);
        $this->_debug = (bool) $debug;
        if (mysqli_connect_errno()) {
            if ($this->_debug) {
                echo mysqli_connect_error();
                debug_print_backtrace();
            }
            return false;
        }
        return true;
    }

    public function q($query) {
        $incomingq = $query;
        if ($query = $this->_mysqli->prepare($query)) {
            if (func_num_args() > 1) {
                $x = func_get_args();
                $args = array_merge(array(func_get_arg(1)),
                    array_slice($x, 2));
                $args_ref = array();
                foreach($args as $k => &$arg) {
                    $args_ref[$k] = &$arg;
                }
                call_user_func_array(array($query, 'bind_param'), $args_ref);
            }
            // Settings
            $SLOW_LOG_TIME = 0.8; // (sec)
            $SLOW_LOG_FILE = 'php_slow.txt';
            $SLOW_LOG_START = time(); // (sec)

            $query->execute();

            // Logging
            $SLOW_LOG_END = microtime(TRUE);
             $time = $SLOW_LOG_END - $SLOW_LOG_START;
            if ($time > $SLOW_LOG_TIME)
            {
                $log = date('Y-m-d H:i:s') . "\t" . round($time, 3) . "\t" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] . "\t" . str_replace(array("\t" , "\n"), "", $incomingq) . "\r\n";
                $fp = fopen($SLOW_LOG_FILE, 'a+');
                fwrite($fp, $log);
                fclose($fp);
            }

            if ($query->errno) {
                if ($this->_debug) {
                    echo mysqli_error($this->_mysqli);
                    debug_print_backtrace();
                }
                return false;
            }

            if ($query->affected_rows > -1) {
            // if ($query->sqlstate == "00000") {
                return $query->affected_rows;
            }
            $params = array();
            $meta = $query->result_metadata();
            while ($field = $meta->fetch_field()) {
                $params[] = &$row[$field->name];
            }
            call_user_func_array(array($query, 'bind_result'), $params);

            $result = array();
            while ($query->fetch()) {
                $r = array();
                foreach ($row as $key => $val) {
                    $r[$key] = $val;
                }
                $result[] = $r;
            }
            $query->close();
            return $result;
        }
        else {
            if ($this->_debug) {
                echo $this->_mysqli->error;
                debug_print_backtrace();
            }
            return false;
        }
    }

    public function handle() {
        return $this->_mysqli;
    }

    public function last_insert_id()
    {
        return $this->_mysqli->insert_id;
    }
}

===============>>#1 票数:5 已采纳

您使用了错误的单位测量: $SLOW_LOG_START = time(); ,time()是秒。

它应与$SLOW_LOG_END = microtime(TRUE);

虽然,microtime(TRUE)是微秒。

所以,改变$SLOW_LOG_START = microtime(TRUE);

===============>>#2 票数:3

你得到的开始时间到最近的秒,结束时间到最近的微秒。

使用microtime用于$SLOW_LOG_START ,否则您的测量结果可能只差一秒钟。

这应该可以解决你的问题。

===============>>#3 票数:2

我确定你已经知道了,但MySQL有自己的慢查询记录器来记录超过指定时间的任何查询。 这样,您需要自己构建它。

  ask by John translate from so

未解决问题?本站智能推荐:

4回复

MYSQL查询执行时间

我有一个问题问你。 我的数据库有250.000条记录,其中2个文本字段最多包含300个单词。 我想选择所有符合某些条件的数据,然后将其放在另一个表中。 我想删除这些不符合我的条件的录音: 如果每一行至少包含这些单词中的任何一个,则可以。 事实是,自执行以来,我已经有3个小时了,什
3回复

mysql查询执行时间 减少查询

我有一个查询,可以更改用户顺序。 这是我的查询: 我想知道执行该查询是否会花费很多时间,如果执行该查询,将如何使其加载更快,并且是否有可能减少该查询? 更新: 我编辑了一些代码,所以现在我认为它将更快地执行查询..这是代码的一部分:
1回复

数据库查询执行时间过长

当前遇到这样的问题,我的数据库查询执行时间太长,有时最终失败并报错:超过了最大执行时间...我试图从彼此不直接相关的不同表中选择数据一个表与另一个表相关,依此类推,其中一些表有上千条记录,我感到不同表的结构导致了这种麻烦,但我无法弄清楚了解如何减少执行时间。 我正在使用CodeIgniter模
1回复

如何增加mysql查询的执行时间

我正在使用带有codeigniter框架的mysql数据库。 在该连接中,一次要连接5个以上的表。 MySql查询很好,它可以正确产生结果,但是要花费大约9-12 sec到9-12 sec时间才能产生结果。 如何增加查询的执行时间。
1回复

SQL查询优化-执行时间

我正在执行以下查询,这花了我2秒钟的时间来执行,现在大约需要10分钟,因为我在表custom_redemptions中增加了100个条目,而在其他表中又增加了大约10个条目。 随着DISTINCT它使我返回 我拿出DISTINCT跟踪该错误,它返回了我 有什么办法可以优化这
2回复

查询执行时间过长

我正在尝试从MySQL数据库获取学生拥有的所有课程。 该代码段仅获取1个进程,但总共有6个进程(然后花费15秒)。 我试图显示通过使用option标签中的selected属性已经设置的课程(如果有)。 我认为这是导致查询执行时间过长的原因。 我的数据库设计有问题吗? 如何改善查询?
3回复

缩短数据库查询执行时间的措施

提前使用Twitter Bootstrap 我已经输入了typeahead 源中的php页面“ getItems.php”的路径。 getItems.php从3个表中获取结果: 执行此查询大约需要22秒钟。 表格产品有654行 表products_categ
1回复

SQL查询执行时间过长

我目前正在从事一个项目,该项目需要我扫描Public Whip Raw数据并返回MP名称列表(他们投票赞成与输入的关键字匹配的策略,例如“猎狐”)。当前的SQL查询完成大约需要30秒,这太长了。 这是在“距离”表和“策略”表中查找的SQL查询。 (这是花太长时间才能执行的) 这是
1回复

MySQL Union查询执行时间过多

我正在尝试从在不同的表和数据库上运行的不同查询中获取单个MySQL查询结果,这是我的数据库名称表结构: 数据库ads1表格: clicks_214 , requests 数据库ads2表格: clicks_255 , requests 数据库ads3表格: clicks_256
3回复

在Query中获取MYSQL查询执行时间

我正在开发一个查询浏览器,使用一些大型数据库,我需要知道执行查询所花费的时间。 在PHPMYADMIN中成功执行查询后,我可以看到时间。 分析或Showing rows 0 - 29 (2,000 total, Query took 0.0145 sec) 例如:分析