Bug #60325 | partition optimization | ||
---|---|---|---|
Submitted: | 3 Mar 2011 21:29 | Modified: | 12 Mar 2011 10:37 |
Reporter: | Roberto Spadim (Basic Quality Contributor) | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Partitions | Severity: | S3 (Non-critical) |
Version: | 5.5, 5.1.57, 5.6.3 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | partition, qc |
[3 Mar 2011 21:29]
Roberto Spadim
[4 Mar 2011 1:29]
Roberto Spadim
check this: ----- create table: CREATE TABLE `est_mov` ( `unidade_id` int(20) NOT NULL DEFAULT '0', `lote_tipo` enum('v','c','i') NOT NULL DEFAULT 'v', `lote_spa` decimal(10,1) NOT NULL DEFAULT '0.0', `item_id` int(20) NOT NULL DEFAULT '0', `item_id_red` int(20) NOT NULL DEFAULT '0', `mov_id` char(30) NOT NULL DEFAULT '0', `oe_tipo` enum('op','oe','tr','ex','bx','bx-tr','rp-tr') NOT NULL DEFAULT 'oe', `oe` bigint(20) NOT NULL DEFAULT '0', `oe_seq` int(20) NOT NULL DEFAULT '0', `table_partition` int(11) NOT NULL DEFAULT '0', `lote_data` date NOT NULL DEFAULT '0000-00-00', `lote` bigint(20) NOT NULL DEFAULT '0', `lote_sif_data` date NOT NULL DEFAULT '0000-00-00', `lote_sif` int(10) unsigned NOT NULL DEFAULT '0', `estoque_entrada_un` int(20) NOT NULL DEFAULT '0', `estoque_entrada_org` int(20) NOT NULL DEFAULT '0', `estoque_entrada_org_red` int(20) NOT NULL DEFAULT '0', `estoque_entrada_mapa` int(20) NOT NULL DEFAULT '0', `estoque_entrada_mapa_red` int(20) NOT NULL DEFAULT '0', `estoque_entrada_pess_tipo` enum('f','j') NOT NULL DEFAULT 'f', `estoque_entrada_pess_id` int(20) NOT NULL DEFAULT '0', `estoque_entrada_propriedade` int(20) NOT NULL DEFAULT '0', `estoque_entrada_proprietario_tipo` enum('f','j') NOT NULL DEFAULT 'f', `estoque_entrada_proprietario_id` int(20) NOT NULL DEFAULT '0', `estoque_saida_un` int(20) NOT NULL DEFAULT '0', `estoque_saida_org` int(20) NOT NULL DEFAULT '0', `estoque_saida_org_red` int(20) NOT NULL DEFAULT '0', `estoque_saida_mapa` int(20) NOT NULL DEFAULT '0', `estoque_saida_mapa_red` int(20) NOT NULL DEFAULT '0', `estoque_saida_pess_tipo` enum('f','j') NOT NULL DEFAULT 'f', `estoque_saida_pess_id` int(20) NOT NULL DEFAULT '0', `estoque_saida_propriedade` int(20) NOT NULL DEFAULT '0', `estoque_saida_proprietario_tipo` enum('f','j') NOT NULL DEFAULT 'f', `estoque_saida_proprietario_id` int(20) NOT NULL DEFAULT '0', `quant_mov_un` char(5) NOT NULL DEFAULT 'un', `quant` decimal(17,5) NOT NULL DEFAULT '0.00000', `pecas` decimal(17,5) NOT NULL DEFAULT '0.00000', `pbruto` decimal(17,5) NOT NULL DEFAULT '0.00000', `pliq` decimal(17,5) NOT NULL DEFAULT '0.00000', `vbruto` decimal(17,5) NOT NULL DEFAULT '0.00000', `vliq` decimal(17,5) NOT NULL DEFAULT '0.00000', `data_etiqueta` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `data_producao` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `data_processamento` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `data_validade` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `data_estoque` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `data_estoque_origem` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `data_estoque_destino` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `rastreabilidade_interna` char(25) NOT NULL DEFAULT '', `rastreabilidade_caixa` char(25) NOT NULL DEFAULT '', `rastreabilidade_externa` char(25) NOT NULL DEFAULT '', `rastreabilidade_pallet` char(25) NOT NULL DEFAULT '', `externa_tipo` char(25) NOT NULL DEFAULT '', `valor_bruto_total` decimal(17,5) NOT NULL DEFAULT '0.00000', `valor_liq_total` decimal(17,5) NOT NULL DEFAULT '0.00000', `custo` decimal(17,5) NOT NULL DEFAULT '0.00000', `custo_medio_anterior` decimal(17,5) NOT NULL DEFAULT '0.00000', `custo_medio_apos` decimal(17,5) NOT NULL DEFAULT '0.00000', `cfop_id` int(20) NOT NULL DEFAULT '0', `cfop_id_red` int(20) NOT NULL DEFAULT '0', `contrato_producao` char(25) NOT NULL DEFAULT '', `quant_real` decimal(17,5) NOT NULL DEFAULT '0.00000', `pecas_real` decimal(17,5) NOT NULL DEFAULT '0.00000', `pliq_real` decimal(17,5) NOT NULL DEFAULT '0.00000', `pbruto_real` decimal(17,5) NOT NULL DEFAULT '0.00000', `vliq_real` decimal(17,5) NOT NULL DEFAULT '0.00000', `vbruto_real` decimal(17,5) NOT NULL DEFAULT '0.00000', `usuario` char(25) NOT NULL DEFAULT '', `sessao` char(41) NOT NULL DEFAULT '', `lote_rendimento_data` date NOT NULL DEFAULT '0000-00-00', `lote_rendimento_numero` int(20) NOT NULL DEFAULT '0', `ponto_movimentacao` int(20) NOT NULL DEFAULT '0', `rendimento` enum('Y','N') NOT NULL DEFAULT 'N', `custo_rendimento` enum('Y','N') NOT NULL DEFAULT 'N', `custo_anterior_rendimento` decimal(17,5) NOT NULL DEFAULT '0.00000', `operacao` int(10) unsigned NOT NULL DEFAULT '0', `data_estoque_ts` decimal(21,7) NOT NULL DEFAULT '0.0000000', `codigo_vinculo_crossdocking` decimal(20,7) unsigned NOT NULL DEFAULT '0.0000000', `crossdock_unidade_id` int(11) NOT NULL DEFAULT '0', `crossdock_lote_tipo` enum('v','c','i') NOT NULL DEFAULT 'v', `crossdock_lote_spa` decimal(10,1) NOT NULL DEFAULT '0.0', `crossdock_oe` int(11) NOT NULL DEFAULT '0', `crossdock_oe_seq` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`unidade_id`,`lote_tipo`,`lote_spa`,`item_id`,`item_id_red`,`mov_id`,`oe_tipo`,`oe`,`oe_seq`,`table_partition`), KEY `lote` (`unidade_id`,`lote_tipo`,`lote_spa`,`item_id`,`item_id_red`,`mov_id`,`oe_tipo`,`oe`,`oe_seq`), KEY `oe` (`unidade_id`,`oe_tipo`,`oe`,`oe_seq`,`item_id`,`item_id_red`), KEY `cfop` (`cfop_id`,`cfop_id_red`), KEY `item` (`item_id`,`item_id_red`,`data_estoque`), KEY `ponto_movimentacao` (`unidade_id`,`oe_tipo`,`ponto_movimentacao`,`usuario`,`data_estoque`,`item_id`,`item_id_red`), KEY `rastro_mov_id` (`mov_id`,`data_estoque`), KEY `rendimento_transfs` (`unidade_id`,`item_id`,`oe_tipo`,`data_estoque`,`oe`,`ponto_movimentacao`), KEY `transferencias` (`item_id`,`data_estoque`,`oe_tipo`,`item_id_red`), KEY `data_estoque` (`data_estoque`), KEY `ponto2` (`unidade_id`,`oe_tipo`,`ponto_movimentacao`,`data_estoque`,`item_id`,`item_id_red`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LIST (table_partition) (PARTITION atual VALUES IN (0) ENGINE = MyISAM, PARTITION historico VALUES IN (1) ENGINE = MyISAM) */ ----- select times: 16125182 rows ============== select count(*) from est_mov; /* 0 rows affected, 1 rows found. Duration for 1 query: 3,650 sec. */ ============== select table_partition,count(*) from est_mov group by table_partition; /* 0 rows affected, 2 rows found. Duration for 1 query: 195,485 sec. */ "table_partition","count(*)" "0","8501418" "1","7623764" ============== 3,650 SECONDS vs 195,485 SECONDS!!!!! check partial, select count(*) from partitions... === select count(*) from est_mov where table_partition=0; /* 0 rows affected, 1 rows found. Duration for 1 query: 16,708 sec. */ select count(*) from est_mov where table_partition=1; /* 0 rows affected, 1 rows found. Duration for 1 query: 21,637 sec. */ === i was specting at least 16,708+21,637=38,345 seconds for count(*) group by table partition...
[12 Mar 2011 10:37]
Sveta Smirnova
Thank you for the report. Verified as described. Strictly this is feature request. Test case for MTR: create table t1( id int not null auto_increment, f1 int, primary key(id, f1) ) engine=myisam partition by list(f1) (partition first values in (1,2,3) engine=myisam, partition second values in (4,5,6) engine=myisam); insert into t1 (f1) values(1),(2),(3),(4),(5),(6); insert into t1 (f1) values(1),(2),(3),(4),(5),(6); insert into t1 (f1) values(1),(2),(3),(4),(5),(6); insert into t1 (f1) values(1),(2),(3),(4),(5),(6); insert into t1 (f1) values(1),(2),(3),(4),(5),(6); insert into t1 (f1) values(1),(2),(3),(4),(5),(6); flush status; show status like 'ha_%'; select count(*) from t1; show status like 'ha_%'; select count(*) from t1 group by f1; show status like 'ha_%'; Result: flush status; show status like 'ha_%'; Variable_name Value Handler_commit 0 Handler_delete 0 Handler_discover 0 Handler_external_lock 0 Handler_mrr_init 0 Handler_prepare 0 Handler_read_first 0 Handler_read_key 0 Handler_read_last 0 Handler_read_next 0 Handler_read_prev 0 Handler_read_rnd 0 Handler_read_rnd_next 0 Handler_rollback 0 Handler_savepoint 0 Handler_savepoint_rollback 0 Handler_update 0 Handler_write 0 select count(*) from t1; count(*) 36 show status like 'ha_%'; Variable_name Value Handler_commit 0 Handler_delete 0 Handler_discover 0 Handler_external_lock 6 Handler_mrr_init 0 Handler_prepare 0 Handler_read_first 0 Handler_read_key 0 Handler_read_last 0 Handler_read_next 0 Handler_read_prev 0 Handler_read_rnd 0 Handler_read_rnd_next 0 Handler_rollback 0 Handler_savepoint 0 Handler_savepoint_rollback 0 Handler_update 0 Handler_write 0 select count(*) from t1 group by f1; count(*) 6 6 6 6 6 6 show status like 'ha_%'; Variable_name Value Handler_commit 0 Handler_delete 0 Handler_discover 0 Handler_external_lock 12 Handler_mrr_init 0 Handler_prepare 0 Handler_read_first 2 Handler_read_key 36 Handler_read_last 0 Handler_read_next 36 Handler_read_prev 0 Handler_read_rnd 6 Handler_read_rnd_next 7 Handler_rollback 0 Handler_savepoint 0 Handler_savepoint_rollback 0 Handler_update 30 Handler_write 6
[25 Apr 2013 11:58]
Mattias Jonsson
If there are multiple list values in a partition, that partition would still need to read all values and do a group by! Only if there is exactly one list value (PARTITION p0 VALUES IN (0)) it could use this optimization.