mac*_*bby 5 mysql pdo stored-procedures prepared-statement
我希望在高流量网站上使用预准备语句加速一些查询.我不认为我正确理解的是使用预准备语句的好处,除非他们可以通过多个连接保持准备.看起来这对PDO来说是不可能的,它也不允许持久连接.但持久连接功能不允许PDO.
为了论证,我说我每秒运行5000次查询:SELECT*FROM some_table WHERE some_column LIKE'some_value'
根据我的理解,如果我每次需要查询时更改"some_value",PDO将阻止mysql重新编译和评估查询.我也明白"some_value"可以用二进制而不是ASCII来传输以节省带宽,但如果我每次打开连接时都必须发送整个查询,它就不会节省太多.
从我所读到的,存储过程也不是解决方案,因为那些也不会通过多个连接保持编译.
有没有解决这个问题的方法?将准备好的语句存储在某个地方的服务器上,并将其保存在内存中,并在收到变量后立即准备好?
有没有办法通过将连接池与PDO相结合来实现这一目标?(虽然我也听说连接池并不理想,因为它会在某些条件下导致阻塞)
在运行了许多基准测试后,我们发现在服务器上准备的预处理语句为我们提供了最大的速度优势.这是一个例子:
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 ;
Run Code Online (Sandbox Code Playgroud)
在 MySQL 中使用准备好的语句不太可能使查询速度更快,而且它也会阻止查询缓存工作。如果您确实需要以 5k/s 的速度运行相同的查询,则需要在数据库前面进行一些缓存。Memcached 很流行,Redis 也很流行。根据您正在执行的操作,缓存元素或整个页面也可能是一个选项。