5

我希望在高流量站点上使用准备好的语句来加速一些查询。我认为我没有正确理解的是使用准备好的语句的好处,除非它们可以通过多个连接保持准备状态。看起来这对于也不允许持久连接的 PDO 是不可能的。但持久连接功能不允许 PDO。

假设为了参数,我每秒运行 5,000 次查询:SELECT * FROM some_table WHERE some_column LIKE 'some_value'

据我了解,如果我每次需要查询时都更改“some_value”,PDO 会阻止 mysql 重新编译和评估查询。我也明白“some_value”可以用二进制而不是 ASCII 传输以节省带宽,但如果我每次打开连接时都必须发送整个查询,它不会节省太多。

同样根据我的阅读,存储过程不是解决方案,因为它们也不会通过多个连接进行编译。

这个问题有什么解决办法吗?将准备好的语句存储在服务器上的某个地方并让它在内存中编译并准备好在收到变量后立即触发?

有没有办法通过将连接池与 PDO 相结合来实现这一点?(虽然我也听说连接池并不理想,因为它会在某些情况下导致阻塞)

4

3 回答 3

5

在运行了许多基准测试后,我们发现在服务器上准备的预处理语句为我们提供了最大的速度优势。这是一个例子:

DROP PROCEDURE IF EXISTS get_user;

DELIMITER //

CREATE PROCEDURE get_user(IN v_user VARCHAR(255))
DETERMINISTIC
READS SQL DATA
SQL SECURITY INVOKER
COMMENT ''
proc: BEGIN
    SET @user = v_user;

    IF ISNULL(@get_user_prepared) THEN
        SET @get_user_prepared = TRUE;

        SET @sql = "SELECT * FROM mysql.user WHERE user = ?";

        PREPARE get_user_stmt FROM @sql;
    END IF;

    EXECUTE get_user_stmt USING @user;
END;
//

DELIMITER ;
于 2012-07-23T05:46:58.603 回答
0

Nope, there is no way to use persistent prepared statements.

However, there is an ideal solution for the query running 5,000 times per second - Handlersocket

于 2013-05-21T19:08:55.663 回答
0

在 MySQL 中使用准备好的语句不太可能使您的查询更快,并且它也会阻止查询缓存工作。如果您确实需要以 5k/s 的速度运行相同的查询,则需要在数据库前面进行一些缓存。Memcached 很流行,Redis 也很流行。根据您的操作,缓存元素或整个页面也可能是一种选择。

于 2012-07-23T03:06:06.060 回答