terça-feira, 13 de abril de 2010

testes de performance mysql com engine=memory

PessoALL,
Estava testando o uso da persistência in memory do mysql e fiquei muito impressionado com os valores alcançados. Segue eles.
A única coisa ruim é que a mesma não guarda os dados, mas para isso estou colocando e uma base MyISam que é alimentada após a postagem de uma mensagem no apache activemq (em torno de 3.000 tps) por nó. E no reestart do mysql recoloco os dados na memória.


tempo de insert para 40 milhoes de linhas (procedure) - 9 min - 74.000 tps
tempo para 40 milhoes de consultas aleatorias pela PK - 21 min - 31.000 tps
tempo para 40 milhoes de atualizacoes - 17 min - 39.000 tps

Segue o sql
SET max_heap_table_size = 10000000000;
CREATE TABLE tb_sico (cd_ip_addr_v4 char(11)not null, cd_mdn char(12) not null, INDEX USING HASH (cd_ip_addr_v4), INDEX USING HASH (cd_mdn)) ENGINE = MEMORY;


drop procedure prc_popula_sico;
delimiter $$
create procedure prc_popula_sico()
BEGIN
DECLARE V_CONTADOR int DEFAULT 0;
DECLARE V_CONTADOR_BLOCO int DEFAULT 0;
DECLARE V_CONTADOR_MAXIMO int DEFAULT 40000000;

SELECT V_CONTADOR_MAXIMO-count(1)
into V_CONTADOR_MAXIMO
from tb_sico;

insert_loop: LOOP
IF ( V_CONTADOR > V_CONTADOR_MAXIMO ) THEN
LEAVE insert_loop;
END IF;

insert into tb_sico values (V_CONTADOR,V_CONTADOR);

SET V_CONTADOR_BLOCO = V_CONTADOR_BLOCO + 1;
IF (V_CONTADOR_BLOCO >= 10000) THEN
SELECT 'carga', now();
SET V_CONTADOR_BLOCO = 0;
END IF;

SET V_CONTADOR = V_CONTADOR + 1;
END LOOP insert_loop;
END
$$
delimiter ;



delimiter ;

drop procedure prc_verifica_sico;
delimiter $$
create procedure prc_verifica_sico()
BEGIN
DECLARE V_CONTADOR int DEFAULT 0;
DECLARE V_CONTADOR_BLOCO int DEFAULT 0;
DECLARE V_CONTADOR_MAXIMO int DEFAULT 40000000;
DECLARE V_RANDOM int DEFAULT 0;
DECLARE V_CD_IP_ADDR_V4 CHAR(11);
DECLARE V_COUNT int DEFAULT 0;

select_loop: LOOP
IF ( V_CONTADOR > V_CONTADOR_MAXIMO ) THEN
LEAVE select_loop;
END IF;

SET V_RANDOM = TRUNCATE(RAND()*V_CONTADOR_MAXIMO, 0);
SET V_CD_IP_ADDR_V4 = V_RANDOM;

SELECT count(1)
into V_COUNT
from tb_sico
WHERE CD_IP_ADDR_V4 = V_CD_IP_ADDR_V4;

SET V_CONTADOR_BLOCO = V_CONTADOR_BLOCO + 1;
IF (V_CONTADOR_BLOCO >= 10000) THEN
SELECT 'verifica', now();
SET V_CONTADOR_BLOCO = 0;
END IF;

SET V_CONTADOR = V_CONTADOR + 1;
END LOOP select_loop;
END
$$
delimiter ;



delimiter ;

drop procedure prc_atualiza_sico;
delimiter $$
create procedure prc_atualiza_sico()
BEGIN
DECLARE V_CONTADOR int DEFAULT 0;
DECLARE V_CONTADOR_BLOCO int DEFAULT 0;
DECLARE V_CONTADOR_MAXIMO int DEFAULT 40000000;
DECLARE V_RANDOM int DEFAULT 0;
DECLARE V_CD_IP_ADDR_V4 CHAR(11);
DECLARE V_CD_MDN CHAR(12);

update_loop: LOOP
IF ( V_CONTADOR > V_CONTADOR_MAXIMO ) THEN
LEAVE update_loop;
END IF;

SET V_RANDOM = TRUNCATE(RAND()*V_CONTADOR_MAXIMO, 0);
SET V_CD_IP_ADDR_V4 = V_RANDOM;
SET V_CD_MDN = V_RANDOM;

update tb_sico
set cd_mdn = V_CD_MDN
WHERE CD_IP_ADDR_V4 = V_CD_IP_ADDR_V4;

SET V_CONTADOR_BLOCO = V_CONTADOR_BLOCO + 1;
IF (V_CONTADOR_BLOCO >= 10000) THEN
SELECT 'atualiza', now();
SET V_CONTADOR_BLOCO = 0;
END IF;

SET V_CONTADOR = V_CONTADOR + 1;
END LOOP update_loop;
END
$$
delimiter ;

Nenhum comentário:

Postar um comentário