2011-09-28 143 views
7

我有一个选择语句的列表,我希望找出他们的查询计划。有没有更简单的方法,而不必每个解释前缀?mysql查询计划

在Sybase中,您可以通过设置一个标记来完成此操作 - 只是想知道是否存在相同的标记?

+0

你打算分析大量的查询吗? :) – Karolis

+0

@Karolis - 整个系统尝试确保它在运行时可以确保不会发生任何性能问题 –

回答

3

可以滥用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';