Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Prezados,
Necessito criar uns índices utilizando os seguintes comando abaixo, mas não estou conseguindo. O que está errado?
Comandos:
CREATE INDEX index_data_mes_ano ON acessos (MONTH(data),YEAR(data))
CREATE INDEX index_data_mes ON acessos (MONTH(data))
CREATE INDEX index_data_ano ON acessos (YEAR(data))
Grato e aguardo qualquer orientação.
>
Que erro ocorre ?
--
Numa busca rápida vi que o Mysql não suporta function-based indices , se for isto uma solução é criar colunas reduntantes de ANO e MES , povoa-las via update (base existente) e TRIGGER (novos registros) e criar os índices por estas colunas
Olá Motta,
Pois é, você acabou de me confirmar o que eu já havia percebido, ou seja, não posso usar MONTH() e/ou YEAR() para a criação dos meu índices. Como não dava certo, cheguei a pensar que seria falta de conhecimento da minha parte ou qualquer coisa do tipo, por isso resolvi pedir ajuda. Sobre o uso de "colunas redundantes", eu também cheguei a conclusão que seria a única saída mesmo, mas pensei que não seria algo tecnicamente correto de se estar fazendo. Agora, com relação a povoar as possíveis novas colunas via UPDATE para os registros já existentes, tudo bem. Só não entendi quando o colega me recomenda o uso de uma TRIGGER para povoar as referidas colunas para novos registros. Pergunta: Não posso simplesmente usar um "INSERT" ou "UPDATE" quando necessário no caso de novos registros? Que tipo de dado devo utilizar para essas novas colunas?
Grato pela sua valiosa atenção e aguardo seu comentário.
A ideia da Trigger é , usando a solução de indices por ANO e MES não precisar alterar a parte da aplicação que faz o insert , a trigger faria isto de forma transparente , mas a solução de informar os campos reduntantes por update ou insert também resolve.
A ideia da Trigger é , usando a solução de indices por ANO e MES não precisar alterar a parte da aplicação que faz o insert , a trigger faria isto de forma transparente , mas a solução de informar os campos reduntantes por update ou insert também resolve.
Ah tá, entendi agora! Realmente a sua ideia de usar uma TRIGGER pelo fato da "transparência", é bem legal.
Só não gostei foi dessa "redundancia de colunas", mas é o jeito!
Mais uma vez obrigado pela sua atenção.
Forte abraço!
Dá uma pesquisada se não tem forma de indexar uma coluna de datas por sua composição.
Dá uma pesquisada se não tem forma de indexar uma coluna de datas por sua composição.
Acho que não! Pesquisei em tudo quando foi de lugar possível e só encontrei algo com a mesma solução.
Só pra constar:
Com base no que foi exposto aqui, consegui reduzir o tempo de um SELECT que levava dois minutos para mais ou menos um segundo. A tabela em questão possui mais de dois milhões de registros.
Valeu pela atenção.
DELIMITER $$
CREATE TRIGGER trigger_acessos_update_year AFTER INSERT ON acessos_trigger
FOR EACH ROW BEGIN
UPDATE acessos_trigger SET ace_ano = YEAR(NEW.ace_acesso)
WHERE ace_controle = NEW.ace_controle;Tentei colocar a trigger logo a cima para rodar, mas me parece que não é possível. Como eu faço para que a mesma ATUALIZE a coluna "ace_ano" no momento da INSERÇÃO com uma trigger?
creio bastar vínculo direto
DELIMITER $
CREATE TRIGGER trigger_acessos_update_year AFTER INSERT ON acessos_trigger
FOR EACH ROW BEGIN
NEW.ace_ano := YEAR(NEW.ace_acesso);
END
$
DELIMITER ;
Deu erro! Tentei modificar algumas coisas, mas sem sucesso.
Erro
Comando SQL:
DELIMITER $
CREATE TRIGGER trigger_acessos_update_year AFTER INSERT ON acessos_trigger
FOR EACH ROW BEGIN
NEW.ace_ano := YEAR(NEW.ace_acesso);
END
$
Mensagens do MySQL : Documentação
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.ace_ano := YEAR(NEW.ace_acesso);
END' at line 3
Creio ser a falta do set
http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html
Set new.ace_ano = year(new.ace_acesso);
Olá Motta, bom dia.
Pra você ver o que uma "cabeça quente" não faz. Olhei tudo... mudei aqui, mudei ali, tentando arrumar e não percebi a falta do "SET". O mesmo é indispensável (rs)! Sendo a sua observação certeira, mesmo assim, na hora de rodar... deu erro normalmente. Só que agora, estando eu com a "cabeça fria", percebi que no lugar de "AFTER INSERT" a coisa só daria certo com um "BEFORE INSERT". Concorda comigo?! Fiz uns simulações e aparentemente ficou certinho.
Mais uma vez obrigado pela sua valiosa atenção.
Forte abraço!
Que erro ocorre ?
--
Numa busca rápida vi que o Mysql não suporta function-based indices , se for isto uma solução é criar colunas reduntantes de ANO e MES , povoa-las via update (base existente) e TRIGGER (novos registros) e criar os índices por estas colunas