Ir para conteúdo
Fórum Script Brasil
  • 0

Lentidão no acesso ao MySQL


Master-Key

Pergunta

Primeiramente, desculpem-nos a extensão do tópico, mas não vemos como não o ser.

Temos uma DB, com 29 tabelas(MyISAM), 702.773 registros e 182,4 Mbytes - NOW.

O sistema basicamente opera com cadastro e gerenciamento de Usuários e Clientes:

Os Clientes realizam cadastro e compras que, geram Pedidos e Produtos (controlado via CB - código de barras - único de 24 caracteres). Temos 10 níveis de Usuários, que conforme seus privilégios gerenciam os Clientes e seus Pedidos, recebem os produtos comprados (pelos Clientes) e os Liquidam (conciliam o Produto recebido contra nossa DB). O controle central é realizado sobre a variação (atualização) dos campos STATUS dos Pedidos e dos Produtos (via CB). Temos uma tabela BASE dos Produtos e uma outra dos Produtos_Conciliados. À medida que novos produtos são comprados, inserimos na tabela base. À medida que são Conciliados (retornam), atualizamos a tabela base e inserimos na Produtos Conciliados.

O gerenciamento envolve obviamente o controle de criação, pagamento, liberação, coleta, entrega, circulação e liquidação - com seus respectivos STATUS e datas (DATE e/ou time Stamps). Basica e grosseiramente, é este o resumo do sistema.

Sabemos que nosso Calcanhar de Aquiles é o campo CB (char(24)) que se interelaciona com o campo STATUS(varchar(15). Pelo tamanho do CB, somos obrigados a utilizar como texto, provocando table scan - memo indexado. Ocorre lentidão tanto na criação dos registros, como atualização dos STATUS destes, em ambas as tabelas principais.

Não usamos JOIN, as clausulas WHERE dentro dos SELECTs estão com os índices apropriados, utilizamos alguns INSERT junto com os SELECTS, possuimos uma tabela de expurgo para dados mais antigos etc; tudo conferido. Como conversado com o Denis, não podemos fornecer muitas informações consideradas privativas, mas certamente podemos apresentar a situação do ambiente e algumas básicas.

1- Nosso maior problema é na leitura do CB (via leitora ou manual), quando o CB é verificado na tabela base e existindo, seus dados são mostrados (via grid) e é efetuado o REFRESH do campo; para a leitura do CB seguinte. Chega a demorar 30 segundos esta operação, tornando impossível a sua utilização em tempo real.

2- Paliativamente, foi criada um aplicação em Delphi(FB-DBExp-BDE) que baixa os dados necessários do DB, realiza a captura do CB e sobe os dados para o DB.

3- Na execução das rotinas de Download e Upload dos dados, o MySQL efetua um loched nas tabelas, de maneira que o ambiente torna-se ainda mais lento (quase instável) - sem falar no alto volume de SLEEP. Mas está ajudando.

4- Operamos em 24 x 7 x 365 - com Usuários e Clientes acessando simultâneamente.

Vamos lá.

Nosso Sever - VPS- é novo e não está adequadamente configurado... já sabemos disto.

Configuração básica:

On this screen you can see the container resources consumption overview.

Please pay attention to the resources nearing their maximum.

CPU Usage CPU 0.18% Load Average 0.02, 0.01, 0.0

Memory Usage

Resource Used Free Total

Memory 174.9 MB 17.08%

849.1 MB 1 GB

Disk Usage

Resource Used Free Total

Disk Space 3.89 GB 4.86%

76.11 GB 80.00 GB

Disk Inodes 172,353 12.31%

1,227,647 1,400,000

========= Serviços======

crond Running

httpd Stopped

iptables Running

mysql Running

sshd Running

xinetd Running

=======================

Tráfico do servidor: Essas tabelas mostram as estatísticas do tráfico da rede neste servidor MySQL desde o início.

Tráfego ø por hora

Recebido 15 MB 732 KB

Enviar 555 MB 27 MB

Total 570 MB 28 MB

Conexões ø por hora %

máx. de conexões concorrentes 9 --- ---

Tentativas falharam 0 0.00 0.00%

Abortado 6 0.00 k 0.18%

Total 3,408 166.23 100.00%

========================

SHOW VARIABLES LIKE '%query_cache%';

have_query_cache YES

query_cache_limit 1048576

query_cache_min_res_unit 4096

query_cache_size 0

query_cache_type ON

query_cache_wlock_invalidate OFF

=====================

SHOW STATUS LIKE '%qcache%';

Qcache_free_blocks 0

Qcache_free_memory 0

Qcache_hits 0

Qcache_inserts 0

Qcache_lowmem_prunes 0

Qcache_not_cached 0

Qcache_queries_in_cache 0

Qcache_total_blocks 0

=====================

SHOW STATUS ;

Variable_name Value

Aborted_clients 6

Aborted_connects 0

Binlog_cache_disk_use 0

Binlog_cache_use 0

Bytes_received 507

Bytes_sent 7960

Com_admin_commands 0

Com_alter_db 0

Com_alter_table 0

Com_analyze 0

Com_backup_table 0

Com_begin 0

Com_call_procedure 0

Com_change_db 0

Com_change_master 0

Com_check 0

Com_checksum 0

Com_commit 0

Com_create_db 0

Com_create_function 0

Com_create_index 0

Com_create_table 0

Com_create_user 0

Com_dealloc_sql 0

Com_delete 0

Com_delete_multi 0

Com_do 0

Com_drop_db 0

Com_drop_function 0

Com_drop_index 0

Com_drop_table 0

Com_drop_user 0

Com_execute_sql 0

Com_flush 0

Com_grant 0

Com_ha_close 0

Com_ha_open 0

Com_ha_read 0

Com_help 0

Com_insert 0

Com_insert_select 0

Com_kill 0

Com_load 0

Com_load_master_data 0

Com_load_master_table 0

Com_lock_tables 0

Com_optimize 0

Com_preload_keys 0

Com_prepare_sql 0

Com_purge 0

Com_purge_before_date 0

Com_rename_table 0

Com_repair 0

Com_replace 0

Com_replace_select 0

Com_reset 0

Com_restore_table 0

Com_revoke 0

Com_revoke_all 0

Com_rollback 0

Com_savepoint 0

Com_select 2

Com_set_option 4

Com_show_binlog_events 0

Com_show_binlogs 0

Com_show_charsets 1

Com_show_collations 1

Com_show_column_types 0

Com_show_create_db 0

Com_show_create_table 0

Com_show_databases 1

Com_show_errors 0

Com_show_fields 0

Com_show_grants 1

Com_show_innodb_status 0

Com_show_keys 0

Com_show_logs 0

Com_show_master_status 0

Com_show_ndb_status 0

Com_show_new_master 0

Com_show_open_tables 0

Com_show_privileges 0

Com_show_processlist 0

Com_show_slave_hosts 0

Com_show_slave_status 0

Com_show_status 1

Com_show_storage_engines 0

Com_show_tables 0

Com_show_triggers 0

Com_show_variables 3

Com_show_warnings 0

Com_slave_start 0

Com_slave_stop 0

Com_stmt_close 0

Com_stmt_execute 0

Com_stmt_fetch 0

Com_stmt_prepare 0

Com_stmt_reset 0

Com_stmt_send_long_data 0

Com_truncate 0

Variable_name Value

Com_unlock_tables 0

Com_update 0

Com_update_multi 0

Com_xa_commit 0

Com_xa_end 0

Com_xa_prepare 0

Com_xa_recover 0

Com_xa_rollback 0

Com_xa_start 0

Compression OFF

Connections 3390

Created_tmp_disk_tables 0

Created_tmp_files 2

Created_tmp_tables 7

Delayed_errors 0

Delayed_insert_threads 0

Delayed_writes 0

Flush_commands 1

Handler_commit 0

Handler_delete 0

Handler_discover 0

Handler_prepare 0

Handler_read_first 0

Handler_read_key 0

Handler_read_next 0

Handler_read_prev 0

Handler_read_rnd 0

Handler_read_rnd_next 180

Handler_rollback 0

Handler_savepoint 0

Handler_savepoint_rollback 0

Handler_update 0

Handler_write 306

Innodb_buffer_pool_pages_data 0

Innodb_buffer_pool_pages_dirty 0

Innodb_buffer_pool_pages_flushed 0

Innodb_buffer_pool_pages_free 0

Innodb_buffer_pool_pages_misc 0

Innodb_buffer_pool_pages_total 0

Innodb_buffer_pool_read_ahead_rnd 0

Innodb_buffer_pool_read_ahead_seq 0

Innodb_buffer_pool_read_requests 0

Innodb_buffer_pool_reads 0

Innodb_buffer_pool_wait_free 0

Innodb_buffer_pool_write_requests 0

Innodb_data_fsyncs 0

Innodb_data_pending_fsyncs 0

Innodb_data_pending_reads 0

Innodb_data_pending_writes 0

Innodb_data_read 0

Innodb_data_reads 0

Innodb_data_writes 0

Innodb_data_written 0

Innodb_dblwr_pages_written 0

Innodb_dblwr_writes 0

Innodb_log_waits 0

Innodb_log_write_requests 0

Innodb_log_writes 0

Innodb_os_log_fsyncs 0

Innodb_os_log_pending_fsyncs 0

Innodb_os_log_pending_writes 0

Innodb_os_log_written 0

Innodb_page_size 0

Innodb_pages_created 0

Innodb_pages_read 0

Innodb_pages_written 0

Innodb_row_lock_current_waits 0

Innodb_row_lock_time 0

Innodb_row_lock_time_avg 0

Innodb_row_lock_time_max 0

Innodb_row_lock_waits 0

Innodb_rows_deleted 0

Innodb_rows_inserted 0

Innodb_rows_read 0

Innodb_rows_updated 0

Key_blocks_not_flushed 0

Key_blocks_unused 6944

Key_blocks_used 7245

Key_read_requests 2099159

Key_reads 31755

Key_write_requests 20925

Key_writes 14258

Last_query_cost 0.000000

Max_used_connections 9

Ndb_cluster_node_id 0

Ndb_config_from_host

Ndb_config_from_port 0

Ndb_number_of_data_nodes 0

Not_flushed_delayed_rows 0

Open_files 107

Open_streams 0

Open_tables 54

Opened_tables 0

Prepared_stmt_count 0

Qcache_free_blocks 0

Qcache_free_memory 0

Qcache_hits 0

Qcache_inserts 0

Qcache_lowmem_prunes 0

Qcache_not_cached 0

Variable_name Value

Qcache_queries_in_cache 0

Qcache_total_blocks 0

Queries 199523

Questions 14

Rpl_status NULL

Select_full_join 0

Select_full_range_join 0

Select_range 0

Select_range_check 0

Select_scan 7

Slave_open_temp_tables 0

Slave_retried_transactions 0

Slave_running OFF

Slow_launch_threads 0

Slow_queries 0

Sort_merge_passes 0

Sort_range 0

Sort_rows 0

Sort_scan 0

Table_locks_immediate 178672

Table_locks_waited 5

Tc_log_max_pages_used 0

Tc_log_page_size 0

Tc_log_page_waits 0

Threads_cached 0

Threads_connected 1

Threads_created 3389

Threads_running 1

Uptime 73586

Uptime_since_flush_status 199523

========================

Variáveis e configurações do servidor - ocultando informações privadas....

Variáveis Valor da sessão / Valor global

auto increment increment 1

auto increment offset 1

automatic sp privileges ON

back log 50

basedir /

binlog cache size 32,768

bulk insert buffer size 8,388,608

character set client utf8

(Valor global) latin1

character set connection utf8

(Valor global) latin1

character set database latin1

character set filesystem binary

character set results utf8

(Valor global) latin1

character set server latin1

character set system utf8

character sets dir /usr/share/mysql/charsets/

collation connection utf8_unicode_ci

(Valor global) latin1_swedish_ci

collation database latin1_swedish_ci

collation server latin1_swedish_ci

completion type 0

concurrent insert 1

connect timeout 10

datadir /var/lib/mysql/

date format %Y-%m-%d

datetime format %Y-%m-%d %H:%i:%s

default week format 0

delay key write ON

delayed insert limit 100

delayed insert timeout 300

delayed queue size 1,000

div precision increment 4

keep files on create OFF

engine condition pushdown OFF

expire logs days 0

flush OFF

flush time 0

ft boolean syntax + -><()~*:""&|

ft max word len 84

ft min word len 4

ft query expansion limit 20

ft stopword file (built-in)

group concat max len 1,024

have archive YES

have bdb NO

have blackhole engine YES

have compress YES

have crypt YES

have csv YES

have dynamic loading YES

have example engine YES

have federated engine YES

have geometry YES

have innodb DISABLED

have isam NO

have merge engine YES

have ndbcluster DISABLED

have openssl NO

have ssl NO

have query cache YES

have raid NO

have rtree keys YES

have symlink YES

hostname xxx.yyyyy.com

init connect

init file

init slave

innodb additional mem pool size 1,048,576

innodb autoextend increment 8

innodb buffer pool awe mem mb 0

innodb buffer pool size 8,388,608

innodb checksums ON

innodb commit concurrency 0

innodb concurrency tickets 500

innodb data file path

innodb data home dir

innodb adaptive hash index ON

innodb doublewrite ON

innodb fast shutdown 1

innodb file io threads 4

innodb file per table OFF

innodb flush log at trx commit 1

innodb flush method

innodb force recovery 0

innodb lock wait timeout 50

innodb locks unsafe for binlog OFF

innodb log arch dir

innodb log archive OFF

innodb log buffer size 1,048,576

innodb log file size 5,242,880

innodb log files in group 2

innodb log group home dir

innodb max dirty pages pct 90

innodb max purge lag 0

innodb mirrored log groups 1

innodb open files 300

innodb rollback on timeout OFF

innodb support xa ON

innodb sync spin loops 20

innodb table locks ON

innodb thread concurrency 8

innodb thread sleep delay 10,000

interactive timeout 28,800

join buffer size 131,072

key buffer size 8,384,512

key cache age threshold 300

key cache block size 1,024

key cache division limit 100

language /usr/share/mysql/english/

large files support ON

large page size 0

large pages OFF

lc time names en_US

license GPL

local infile ON

locked in memory OFF

log OFF

log bin OFF

log bin trust function creators OFF

log error

log queries not using indexes OFF

log slave updates OFF

log slow queries OFF

log warnings 1

long query time 10

low priority updates OFF

lower case file system OFF

lower case table names 0

max allowed packet 1,048,576

max binlog cache size 4,294,963,200

max binlog size 1,073,741,824

max connect errors 10

max connections 100

max delayed threads 20

max error count 64

max heap table size 16,777,216

max insert delayed threads 20

max join size 18446744073709551615

max length for sort data 1,024

max prepared stmt count 16,382

max relay log size 0

max seeks for key 4,294,967,295

max sort length 1,024

max sp recursion depth 0

max tmp tables 32

max user connections 0

max write lock count 4,294,967,295

multi range count 256

myisam data pointer size 6

myisam max sort file size 2,146,435,072

myisam recover options OFF

myisam repair threads 1

myisam sort buffer size 8,388,608

myisam stats method nulls_unequal

ndb autoincrement prefetch sz 1

ndb force send ON

ndb use exact count ON

ndb use transactions ON

ndb cache check time 0

ndb connectstring

net buffer length 16,384

net read timeout 30

net retry count 10

net write timeout 60

new OFF

old passwords ON

open files limit 1,024

optimizer prune level 1

optimizer search depth 62

pid file /var/lib/mysql/xxx.yyyyy.com.pid

plugin dir

port 3,306

preload buffer size 32,768

profiling OFF

profiling history size 15

protocol version 10

query alloc block size 8,192

query cache limit 1,048,576

query cache min res unit 4,096

query cache size 0

query cache type ON

query cache wlock invalidate OFF

query prealloc size 8,192

range alloc block size 4,096

read buffer size 131,072

read only OFF

read rnd buffer size 262,144

relay log

relay log index

relay log info file relay-log.info

relay log purge ON

relay log space limit 0

rpl recovery rank 0

secure auth OFF

secure file priv

server id 0

skip external locking ON

skip networking OFF

skip show database OFF

slave compressed protocol OFF

slave load tmpdir /tmp/

slave net timeout 3,600

slave skip errors OFF

slave transaction retries 10

slow launch time 2

socket /var/lib/mysql/mysql.sock

sort buffer size 2,097,144

sql big selects ON

sql mode

sql notes ON

sql warnings OFF

ssl ca

ssl capath

ssl cert

ssl cipher

ssl key

storage engine MyISAM

sync binlog 0

sync frm ON

system time zone BRT

table cache 64

table lock wait timeout 50

table type MyISAM

thread cache size 0

thread stack 196,608

time format %H:%i:%s

time zone SYSTEM

timed mutexes OFF

tmp table size 33,554,432

tmpdir /tmp/

transaction alloc block size 8,192

transaction prealloc size 4,096

tx isolation REPEATABLE-READ

updatable views with limit YES

version 5.0.81-community

version comment MySQL Community Edition (GPL)

version compile machine i686

version compile os pc-linux-gnu

wait timeout 28,800

======================

O arquivo My.cnf esta na forma mais básica possível...

=======================

Estrutura da Tabale BASE:

Campo Tipo Collation Atrib Nulo Padrão Extra

cod_vale char(5) latin1_general_ci Não

cod_ped char(5) latin1_general_ci Não

cod_it varchar(3) latin1_general_ci Não

data_emissao datetime Não 0000-00-00 00:00:00

data_val datetime Não 0000-00-00 00:00:00

data_conc datetime Não 0000-00-00 00:00:00

empresa_var varchar(50) latin1_general_ci Não

end_entrega varchar(100) latin1_general_ci Não

tel char(10) latin1_general_ci Não

contato varchar(50) latin1_general_ci Não

cb char(24) latin1_general_ci Não

valor varchar(4) latin1_general_ci Não

extenso varchar(36) latin1_general_ci Não

mensagem varchar(25) latin1_general_ci Não

val char(6) latin1_general_ci Não

valor_total varchar(9) latin1_general_ci Não

status varchar(15) latin1_general_ci Sim NULL

liquidante varchar(50) latin1_general_ci Sim NULL

mat varchar(5) latin1_general_ci Sim NULL

---------------------------

Índices:

Nome chave Tipo Cardinalidade Ação Campo

cb INDEX 346781 cb

status INDEX 1 status

-----------------

Uso do espaço

Tipo Uso

Dados 132.7 MB

Índice 8,231.0 KB

Total 140.7 MB

Estatísticas do registros

Comandos Valor

Formato dinâmico

Collation latin1_general_ci

Registros 346,781

Tamanho do registro ø 401

Tamanho do registro ø 426 Bytes

Criação Jun 22, 2009 as 08:46 PM

Última atualização Jul 01, 2009 as 06:40 PM

Última verificação Jul 01, 2009 as 06:40 PM

==================

Exemplos de Comandos - somente para ter uma idéia.

Capturamos o CB, verificamos se existe na tabela BASE e seu STATUS.

Se existir, cfe o STUATUS é gravado nas tabelas de controle. Se existir e ainda não estiver liquidado, a tabela BASE é atualizada, grava-se os dados na tabela de controle movimentação, prepara-se outras tabelas de controle de pagamento e provisão financeira, comissões etc.

Segue pequeno trecho da rotina que efetua a liquidação do produto que está em circulação:

//Verificar se CB já foi conciliado

$status200 = 'Conciliado';

$sql_CB_check71 = mysql_query("SELECT COUNT(cb) FROM base WHERE cb='{$cb}' and status='{$status200}'");

$uReg71 = mysql_fetch_array($sql_CB_check71,MYSQL_NUM);

$cb_check71 = $uReg71[0];

if(($cb_check71 > 0) && ($v == 1)) {

echo "&lt;script>alert('Já Conciliado!')</script>";

$sql18 = mysql_query("INSERT INTO rejeitados (cod_ped_conc, cb, status,usuario,data)

VALUES('$lote', '$cb', '$status200','$usuario',now())")

or die( mysql_error() );

$v = 0;

}

===============

//Após ler e encontrar CB e estando OK, os dados serão salvos na tabela conc_temp

$sql4 = mysql_query("INSERT INTO conc_temp (cod_ped, cod_prod_conc, cb, num_ped, num_prod, num_item, status, valor,data_val,dt_ent)

VALUES('$lote', '$cod_val', '$cb', '$numped', '$numprod', '$numitem', '$status', '$vr_val','$dt_val',now())")

or die( mysql_error() );

$qdte_prod_lido = $qdte_prod_lido + 1;

$qtde_prod_inval = $qtde_prod_inval + 1;

}

---------- uma vez gravado na temp e atualizada a base, ocorre o REFRESH.... que é bem demorado...

========

Agradeço-lhes quaisquer ajuda e/ou sugestões, estando pronto para maiores informações.

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0
Sabemos que nosso Calcanhar de Aquiles é o campo CB (char(24)) que se interelaciona com o campo STATUS(varchar(15). Pelo tamanho do CB, somos obrigados a utilizar como texto, provocando table scan - memo indexado. Ocorre lentidão tanto na criação dos registros, como atualização dos STATUS destes, em ambas as tabelas principais.

A comparação entre strings é sempre lenta, por isso, sempre que temos em uma tabela, uma string que se repete para N registros é conveniente separá-la em uma tabela e utilizar um relacionamento.

Pelo nome da sua coluna "STATUS" eu não acredito que você tenha um número muito grande de status possíveis. Se o status for um campo volátil (onde é possível adicionar ou remover um status existente) então eu criaria uma tabela para os status possíveis e utilizaria um id para relacionar, se o status for um conjunto de valores fixos que nunca serão modificados então eu modificaria esse campo de VARCHAR para um ENUM contendo todas as possibilidades existentes.

Quanto ao código de barras, você tem o problema do tamanho do número, nesse caso você pode "Dividir para conquistar", eu separaria seu código de 24 dígitos em 4 módulos de 6 dígitos; Dessa forma o maior número de um dos módulos estaria ainda dentro do limite de um UNSIGNED INT.

Ex:

$codigo = "123456789012345678901234";

$part1 = 123456;
$part2 = 789012;
$part3 = 345678;
$part4 = 901234;
Dessa forma, por maior que seja uma das partes, sempre será um INT sem sinal (0 - 4294967295) Feito isso você pode criar sua tabela que conterá o código de barra, particionando-a de forma vertical
CREATE TABLE CB (
    id    INT UNSIGNED NOT NULL AUTO_INCREMENT,
    A    INT UNSIGNED NOT NULL,
    B    INT UNSIGNED NOT NULL,
    C    INT UNSIGNED NOT NULL,
    D    INT UNSIGNED NOT NULL,
    PRIMARY KEY( id , A ),
    INDEX parts( A , B , C , D )
)
ENGINE = MyISAM
PARTITION BY RANGE ( A )(
    PARTITION p0 VALUES LESS THAN ( 99999 ),
    PARTITION p1 VALUES LESS THAN ( 199998 ),
    PARTITION p2 VALUES LESS THAN ( 299997 ),
    PARTITION p3 VALUES LESS THAN ( 399996 ),
    PARTITION p4 VALUES LESS THAN ( 499995 ),
    PARTITION p5 VALUES LESS THAN ( 599994 ),
    PARTITION p6 VALUES LESS THAN ( 699993 ),
    PARTITION p7 VALUES LESS THAN ( 799992 ),
    PARTITION p8 VALUES LESS THAN ( 899991 ),
    PARTITION p9 VALUES LESS THAN MAXVALUE
)
Bom, para teste eu populei essa tabela com 16000000 de registros e fiz uma pesquisa por um código de barras:
SELECT id , concat( A , B , C , D ) "cb" FROM CB WHERE ( A = 100015 ) AND ( B = 350198 ) AND ( C = 600381 ) AND ( D = 850564 );
O resultado foi:
mysql> SELECT id , concat( A , B , C , D ) "cb" FROM CB WHERE ( A = 100015 ) AND ( B = 350198 ) AND ( C = 600381 ) AND ( D = 850564 );
+---------+--------------------------+
| id      | cb                       |
+---------+--------------------------+
| 9521226 | 100015350198600381850564 |
+---------+--------------------------+
1 row in set (0.00 sec)
Mesmo com 16.000.000 de registros o resultado da query foi instantâneo, isso porque:
mysql> explain SELECT id , concat( A , B , C , D ) "cb" FROM CB WHERE ( A = 100015 ) AND ( B = 350198 ) AND ( C = 600381 ) AND ( D = 850564 );
+----+-------------+-------+------+---------------+-------+---------+-------------------------+------+-------+
| id | select_type | table | type | possible_keys | key   | key_len | ref                     | rows | Extra |
+----+-------------+-------+------+---------------+-------+---------+-------------------------+------+-------+
|  1 | SIMPLE      | CB    | ref  | parts         | parts | 16      | const,const,const,const |    1 |       |
+----+-------------+-------+------+---------------+-------+---------+-------------------------+------+-------+
1 row in set (0.00 sec)
mysql> SELECT count(*) FROM CB WHERE ( A = 100015 ) AND ( B = 350198 ) AND ( C = 600381 ) AND ( D = 850564 );
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)
mysql> explain SELECT count(*) FROM CB WHERE ( A = 100015 ) AND ( B = 350198 ) AND ( C = 600381 ) AND ( D = 850564 );
+----+-------------+-------+------+---------------+-------+---------+-------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key   | key_len | ref                     | rows | Extra       |
+----+-------------+-------+------+---------------+-------+---------+-------------------------+------+-------------+
|  1 | SIMPLE      | CB    | ref  | parts         | parts | 16      | const,const,const,const |    1 | Using index |
+----+-------------+-------+------+---------------+-------+---------+-------------------------+------+-------------+
1 row in set (0.00 sec)
Em vez de utilizar uma comparação de string, utilizamos 4 valores constantes. Usando o PHP para separar o código em partes:
/**
 * Separa uma string que representa um código de barras de 24 digitos em blocos numéricos
 * @param string $numstr O código de barras
 * @param integer $parts O número de blocos
 * @param integer $length O tamanho máximo do código
 * @return array Matriz contendo os blocos numéricos
 */
function str2numPart( $numstr , $parts = 4 , $length = 24 ){
    $ret = array();

    /**
     * Verificamos se o tamanho da string é exatamente igual ao valor do parâmetro $length
     */
    if ( ( $clength = strlen( $numstr ) ) == $length ){
        $bloco = floor( $length / $parts );

        /**
         * Separamos a string na quantidade de blocos definida pelo parâmetro $parts
         */
        while ( strlen( $numstr ) ){
            $ret[] = (int) substr( $numstr , 0 , $bloco );
            $numstr  = substr( $numstr , $bloco );
        }
    } else {
        throw new UnexpectedValueException( sprintf( "A representação do número deve ter de comprimento exatamente %d, %d foi dado" , $length , $clength ) );
    }

    return( $ret );
}

$nustr = "100015350198600381850564";
$sql = sprintf( "SELECT count(*) FROM CB WHERE %s;" , vsprintf( "( A = %d ) AND ( B = %d ) AND ( C = %d ) AND ( D = %d )" , str2numPart( $nustr ) ) );

var_dump( $sql ); //string(102) "SELECT count(*) FROM CB WHERE ( A = 100015 ) AND ( B = 350198 ) AND ( C = 600381 ) AND ( D = 850564 );"

[]'s

J. Neto

Editado por neto.joaobatista
Link para o comentário
Compartilhar em outros sites

  • 0

Vivendo e aprendendo J. Neto.

Criamos o relacionamento para o STATUS, mas não obtivemos uma ganho significativo.

Ótima a idéia de Dividir para Conquistar. Já repassei ao nosso programador para que analise a possibilidade. Teremos de criar uma cópia do DB, porque não podemos realizar no DB original, devido à necessidade de bloquear os acessos dos usuários e Clientes.

Como a tarefa será demorada, quando tivermos um comparativo das situações, estarei postando o resultado.

Obrigado pela orientação.

Link para o comentário
Compartilhar em outros sites

  • 0
Criamos o relacionamento para o STATUS, mas não obtivemos uma ganho significativo.

Eu imaginei mesmo que o ganho para o status seria pequeno, mesmo porque o seu vilão de verdade é o código de barras. Porém, se for possível reduzir tanto no "status" quanto no código de barras então acredito que o ganho será bem maior

Ótima a idéia de Dividir para Conquistar. Já repassei ao nosso programador para que analise a possibilidade. Teremos de criar uma cópia do DB, porque não podemos realizar no DB original, devido à necessidade de bloquear os acessos dos usuários e Clientes.

Como a tarefa será demorada, quando tivermos um comparativo das situações, estarei postando o resultado.

Quando você tiver os dados, poste no fórum, fiquei curioso quanto ao desempenho...

Obrigado pela orientação.

Abraços...

J. Neto

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...