gpt4 book ai didi

mysql查询计划

转载 作者:可可西里 更新时间:2023-11-01 06:38:12 25 4
gpt4 key购买 nike

我有一个 select 语句列表,我想找出它们的查询计划。有没有一种更简单的方法,而不是必须在每个前缀上加上解释?

在 Sybase 中,您可以通过设置标志来做到这一点 - 只是想知道是否有等效项?

最佳答案

你可以滥用 slow query log为此:

设置long_query_time = 0,这将强制MySQL 将所有查询记录在慢查询日志中。

现在设置您希望日志显示的位置,请参阅:http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html确保你让慢速查询日志将你的查询放在一个表中,这是 5.1+ 中的默认值

现在写一个这样的存储过程:

DELIMITER $$

CREATE PROCEDURE run_explain_on__the_slow_query_log(IN which_db VARCHAR(512))
BEGIN
DECLARE sql VARCHAR(10000);
DECLARE done INTEGER DEFAULT 0;
DECLARE cursor1 CURSOR FOR SELECT sql_text FROM mysql.slow_log
WHERE sql_text LIKE 'SELECT%'
AND (db = which_db OR which_db IS NULL);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN cursor 1;
WHILE NOT (done) DO
FETCH cursor1 INTO sql;
SET sql = CONCAT('EXPLAIN EXTENDED ',sql);
PREPARE stmt FROM sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END WHILE;
END $$

DELIMITER ;

您可能需要稍微调整一下,这是 slow_log 表的创建语句。

CREATE TABLE mysql.slow_log(
start_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
user_host MEDIUMTEXT NOT NULL,
query_time TIME NOT NULL,
lock_time TIME NOT NULL,
rows_sent INT(11) NOT NULL,
rows_examined INT(11) NOT NULL,
db VARCHAR(512) NOT NULL,
last_insert_id INT(11) NOT NULL,
insert_id INT(11) NOT NULL,
server_id INT(10) UNSIGNED NOT NULL,
sql_text MEDIUMTEXT NOT NULL
)
ENGINE = CSV
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Slow log';

关于mysql查询计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7581674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com