2011-09-28 4 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 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';