Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Aprendiz/CE

create index com year() e month()

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
mas não estou conseguindo

 

 

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá uma pesquisada se não tem forma de indexar uma coluna de datas por sua composição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
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;
END
$$
DELIMITER ;

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.