2011-09-28 3 views
7

私はselectステートメントのリストを持っており、そのクエリプランを知りたいと思います。それぞれにプレフィックスを付ける代わりに簡単な方法がありますか?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文です。

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'; 
関連する問題