2011-09-28 22 views
7

Seçme ifadelerin bir listesi var ve onların sorgu planlarını öğrenmek istiyorum. Her birini açıklamak zorunda kalmak yerine daha kolay bir yol var mı?mysql sorgu planları

Sybase'de bunu bir bayrak ayarlayarak yapabilirsiniz - sadece eşdeğer olup olmadığını merak ediyor musunuz?

+0

Çok sayıda sorguyu paralel olarak analiz edebilecek misiniz? :) – Karolis

+0

@Karolis - Tüm sistem, canlı yayına geçtiğinde emin olmak için hiçbir performans probleminin olmayacağından emin olabilirsiniz. –

cevap

3

Bunun için slow query log kötüye kullanabilirler:

Set long_query_time = 0, bu yavaş sorgu günlüğüne tüm sorguları günlüğe MySQL zorlayacaktır.

Şimdi görünmesini günlüğü istediğiniz bkz ayarlayın: http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html yavaş sorgu günlük bir tabloda sorguları koymak izin emin olun, bu Şimdi 5.1+

varsayılan gibi bir saklı yordam yazmak olduğunu böylece:

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 ; 

ona bir bit oynamak gerekebilir, burada slow_log tablonun oluşturmak ifadesi.

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';