蓝伤sky 2016-04-07 07:17 采纳率: 0%
浏览 1594

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条回答 默认 最新

  • 不良使 Python领域潜力新星 2023-06-06 21:14
    关注

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

    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() 方法来批量获取结果集,减少了对数据库的访问次数。注意,这只是一个简单的例子,实际情况可能有所不同。在优化存储过程执行效率时,需要根据具体情况进行调整和优化。

    评论

    报告相同问题?

    悬赏问题

    • ¥15 burpsuite密码爆破
    • ¥15 关于#ubuntu#的问题,如何解决?(相关搜索:移动硬盘)
    • ¥15 scikit安装之后import不了
    • ¥15 Ros2编译一个使用opencv的c++节点的时候,报了这个错误,请问怎么解决啊
    • ¥15 人脸识别相关算法 YOLO,AI等
    • ¥15 spark问题方便加V17675797079
    • ¥15 Python代码不打印的原因
    • ¥20 微软SEAL库的安装和使用,VS2022环境配置问题
    • ¥15 数学问题也不知道那种类型的问题
    • ¥15 R作图的时候,文本框重叠了怎么办?