Indice De Multiplas Colunas
#1
Posted 28/09/2009, 22:39
No Mysqk consigo localizar um registro em uma table que possui indice composto por várias colunas?
ex:
Tenho um índice na table "B" que se chama "Procura" e este indice é composto pelos campos
Banco - Agencia - Nr_Cheque e Valor. Preciso que o programa leia a tabela "A" e localize o
a informação na table "B" através do índice citado. Como fazer?? Ah, as tables possui milhares
de registros.
#2
Posted 29/09/2009, 10:37
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29
#3
Posted 29/09/2009, 19:34
Basta você usar na query os campos que compõe o índice, lembrando que você precisa ter no mínimo o campo mais a esquerda do índice composto para que ele possa ser usado.
Na realidade, no momento em que o registro for encontrado na tabela "B" este deverá ser editado e seu campo chamado
"Tipo" receberá "4". Ou seja, o programa deve percorrer a tabela "A", ler seus registro um a um, comparar com cada
registro da tabela "B" através do índice "Procura" e se localizar deverá editá-lo na "B", inserindo "4" no campo "Tipo".
Alguem poderia me enviar um modelo desse script?? Grato.
#4
Posted 29/09/2009, 20:04
Enfim, então você quer atualizar os registros da tabela B onde exista na tabela A, checando isso por: banco + agencia + nr_cheque e valor.
Então ficaria, por exemplo:
update b, a set b.tipo = 4 where (b.banco, b.agencia, b.nr_cheque, b.valor) = (a.banco, a.agencia, a.nr_cheque, a.valor);
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29
#5
Posted 29/09/2009, 21:43
Ops, desconsidere minha resposta anterior. Eu estava pensando em outra coisa.
Enfim, então você quer atualizar os registros da tabela B onde exista na tabela A, checando isso por: banco + agencia + nr_cheque e valor.
Então ficaria, por exemplo:update b, a set b.tipo = 4 where (b.banco, b.agencia, b.nr_cheque, b.valor) = (a.banco, a.agencia, a.nr_cheque, a.valor);
Consegui localizar e atualizar conforme abaixo. A sintaxe para utilização de índice composto está correta????:
$rsCheques = $mySQL->sql("UPDATE B USE INDEX (Procura30) SET Tipo = 4 WHERE Banco = 1 AND Agencia = 32 AND Numero = 850518 AND Valor = 2493.00;");
Então gostaria de saber como faço para receber os dados da tabela "A" através de um loop e atualizar os dados em "B" de
forma que quando terminar de percorrer a tabela "A" todos os dados localizados em "B" estarão atualizados.
#6
Posted 29/09/2009, 22:46
A instrução que lhe passei anteriormente já faz o "loop" de cada linha da tabela b e tenta encontrar os dados que batam na tabela a, se encontrar ele altera o tipo.
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29
#7
Posted 30/09/2009, 01:49
Seus updates estão muito lentos? A documentação do MySQL diz que você pode usar esses hints de índices, porém eles não serão usados em comandos UPDATE.
A instrução que lhe passei anteriormente já faz o "loop" de cada linha da tabela b e tenta encontrar os dados que batam na tabela a, se encontrar ele altera o tipo.
Com seu exemplo o tempo browser utrapassou 60 segundos e programa parou. Com o código abaixo o processamento
foi realizado em 9 segundos pois a localização utilizando indice é mais rapido, cfe doc Mysql:
$rsCheques = $mySQL->sql("SELECT Banco, Agencia, Numero, Valor FROM A;"); while ($row_rsCheques = mysql_fetch_array($rsCheques)) { $mySQL->sql("UPDATE B USE INDEX (Procura) SET Tipo = 4 WHERE Banco = $row_rsCheques[0] AND Agencia = $row_rsCheques[1] AND Numero = $row_rsCheques[2] AND Valor = $row_rsCheques[3] LIMIT(1);"); }
Desculpe mas gostaria de saber se tem forma ainda mais rápida pois as minhas tabela possuem mais de 60.000 linhas.
e o teste foi realizado com tabela de 30.000 linhas.
#8
Posted 30/09/2009, 07:48
O que você pode fazer é melhorar o SELECT, pegando somente os registros que existem em A e B, e que o tipo não seja 4 para fazer o UPDATE.
SELECT B.Banco, B.Agencia, B.Numero, B.Valor FROM B FORCE INDEX (Procura) STRAIGHT_JOIN A ON A.Banco = B.Banco AND A.Agencia = B.Agencia AND A.Numero = B.Numero AND A.Valor = B.Valor WHERE B.Tipo <> 4
E claro, se a tabela B é a que tem menos registros, é melhor utilizá-la para fazer a busca. Além do mais, como você está fazendo o UPDATE na B, é melhor guiar-se pela existência de registro nela, não na tabela A. Onde possivelmente está fazendo rodar vários UPDATE que não encontram linha alguma. (Não sei como estão os dados em ambas) Sem falar que você está apenas alterando para um valor fixo. Sem obter qualquer correspondente na outra tabela.
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29
#9
Posted 01/10/2009, 00:09
Tudo bem, eu sei que o uso de índice otimiza as consultas. Eu só quis dizer que o USE INDEX é inútil em UPDATE (a doc. diz que aceita a sintaxe, mas não tem significado no UPDATE). O que lhe ajudou foi o SELECT para direcionar as possíveis linhas.
O que você pode fazer é melhorar o SELECT, pegando somente os registros que existem em A e B, e que o tipo não seja 4 para fazer o UPDATE.SELECT B.Banco, B.Agencia, B.Numero, B.Valor FROM B FORCE INDEX (Procura) STRAIGHT_JOIN A ON A.Banco = B.Banco AND A.Agencia = B.Agencia AND A.Numero = B.Numero AND A.Valor = B.Valor WHERE B.Tipo <> 4
E claro, se a tabela B é a que tem menos registros, é melhor utilizá-la para fazer a busca. Além do mais, como você está fazendo o UPDATE na B, é melhor guiar-se pela existência de registro nela, não na tabela A. Onde possivelmente está fazendo rodar vários UPDATE que não encontram linha alguma. (Não sei como estão os dados em ambas) Sem falar que você está apenas alterando para um valor fixo. Sem obter qualquer correspondente na outra tabela.
Gostei da sua sujestão. Vou implementá-la.
Muito obrigado!
#10
Posted 26/09/2017, 05:03
Cialis With Priligy Pills Propecia New York cialis online Preisvergleich Viagra Generika Best On Line Viagra Sellers Priligy Que Es
#11
Posted 26/09/2017, 12:22
#12
Posted 09/10/2017, 23:52
Sky Pharmacy Canada viagra Prezzo Viagra Italia Chewable Visgra Best Prices For Viagra Cialis
100 Mg Viagra Pfizer levitra generico miglior prezzo india Alcool Et Tadalis Sx
#13
Posted 25/10/2017, 14:17
Buy Orlistat 60 Mg With No Prescription Propecia Uk 1mg viagra Discount Zentel Where To Order With Next Day Delivery
Levitra Barato Can I Mix Amoxicillin With Water cialis Cialis Once Day Discount Real On Line Elocon Tablet Medicine Overseas Mastercard Propecia Buy Uk
#14
Posted 27/10/2017, 13:47
Levitra Purchase Uk Off Shore Viagra Compare Avelox To Keflex generic viagra Prednisone Orders Canada
0 user(s) are reading this topic
0 membro(s), 0 visitante(s) e 0 membros anônimo(s)