2011-09-28 23 views
7

Tengo una lista de declaraciones seleccionadas y deseo conocer sus planes de consulta. ¿Hay alguna manera más fácil en lugar de tener que prefijar cada una con la explicación?mysql query plans

En Sybase puede hacer esto configurando un indicador - ¿se pregunta si hay un equivalente?

+0

¿Vas a analizar un gran número de consultas en paralelo? :) – Karolis

+0

@Karolis - Todo el sistema para intentar garantizar que cuando entre en funcionamiento pueda estar seguro de que no se producirán problemas de rendimiento –

Respuesta

3

Puede abusar de la slow query log para esto:

Conjunto long_query_time = 0, esto obligará a MySQL para registrar todas las consultas en el registro de consultas lentas.

Ahora establecer donde desea que el registro a aparecer, ver: http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html Asegúrese de que deja que el registro de consultas lentas puso sus consultas en una tabla, este es el valor por defecto en 5.1+

Ahora escribir un procedimiento almacenado como por lo que:

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 ; 

es posible que tenga que ajustar un poco, aquí está la sentencia de creación de la tabla 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';