CI调用存储过程很慢怎么提速,mysql存储过程本身执行很快,但是在php调用就要0.8s

                            $this -> db -> reconnect();
                            $mysqli = new mysqli();

                            $mysqli -> query("SET NAMES utf8");
                            if (mysqli_connect_errno()) {
                                    printf('Connect failed: %s\n', mysqli_connect_error());
                                    exit();
                            }

                            if($set){
                                    $mysqli ->multi_query("SET {$set} ");
                            }
                            //$query  = 'CALL p_MyFrontAndBackListTie(2)';

                            /* execute multi query */
                            if ($mysqli -> multi_query($query)) {
                                    do {
                                            /* store first result set */
                                            if ($result = $mysqli -> store_result()) {
                                                     while ($row = $result -> fetch_all()) {
                                                            $all_result[] = $row;
                                                      }
                                                    $result -> free();
                                            }
                                    }
                                    while ($mysqli -> next_result());
                            }
                                    /* close connection */
                            $mysqli -> close();

                            return $all_result;

在代码中使用存储过程来处理数据时,往往需要多次进行数据库连接和关闭,这会增加数据库操作的时间。为了避免这种情况,可以将多次数据库连接和关闭的代码封装在一个类或函数中,供需要调用存储过程的代码使用。同时还可以考虑一些其他的优化手段,比如:

  1. 缓存结果集:在存储过程返回结果集时,可以将结果集缓存起来,供需要的代码使用,这可以减少对数据库的查询次数。

  2. 优化存储过程:可以使用 MySQL 自带的性能分析工具 EXPLAIN 来找到存储过程的性能瓶颈,进而进行优化。

  3. 调整数据库参数:可以通过调整 MySQL 的一些参数来优化存储过程的执行效率,比如 max_allowed_packetwait_timeout 等参数。

  4. 采用缓存技术:可以使用缓存技术来缓存存储过程的结果,这可以减少对数据库的访问次数,进而提高性能。

  5. 采用异步技术:可以将存储过程的执行放到一个异步任务中执行,这可以将存储过程的执行与程序的其他逻辑分离,进而提高程序的响应速度。

总之,可以通过代码优化、存储过程优化、数据库参数调整以及采用缓存技术和异步技术等手段,来提高存储过程的执行效率,从而优化程序性能。

下面是一个简答的优化版本:

// 封装一个类来处理数据库连接
class DB {
    private $mysqli;
    private $host = 'localhost';
    private $username = 'root';
    private $password = 'password';
    private $dbname = 'myDatabase';

    public function __construct() {
        $this->mysqli = new mysqli($this->host, $this->username, $this->password, $this->dbname);
        $this->mysqli->query("SET NAMES utf8");
        if (mysqli_connect_errno()) {
            printf('Connect failed: %s\n', mysqli_connect_error());
            exit();
        }
    }

    public function query($sql) {
        $this->mysqli->multi_query($sql);
        $all_result = array();
        do {
            if ($result = $this->mysqli->store_result()) {
                $all_result[] = $result->fetch_all();
                $result->free();
            }
        } while ($this->mysqli->next_result());
        return $all_result;
    }

    public function __destruct() {
        $this->mysqli->close();
    }
}

// 调用DB类来执行存储过程
$db = new DB();
$query = 'CALL p_MyFrontAndBackListTie(2)';
$all_result = $db->query($query);
return $all_result;

这里将数据库连接和关闭封装在了 DB 类中,同时使用了 fetch_all() 方法来批量获取结果集,减少了对数据库的访问次数。注意,这只是一个简单的例子,实际情况可能有所不同。在优化存储过程执行效率时,需要根据具体情况进行调整和优化。