Otimização de Query MySql - Using temporary; Using filesort
Alguém pode me ajudar?
Tenho a seguinte query:
select cc.CampoConhecimento, COUNT(distinct(cc.idCv)) as Total,
count(CASE WHEN cc.NivelConhecimento = 1 OR cc.NivelConhecimento = 0 OR cc.NivelConhecimento IS NULL THEN 'Basico' ELSE NULL END) as Basico,
count(CASE WHEN cc.NivelConhecimento = 2 THEN 'Intermediario' ELSE NULL END) as Intermediario,
count(CASE WHEN cc.NivelConhecimento = 3 THEN 'Avancado' ELSE NULL END) as Avancado
from tblCurriculoConhecimento cc
inner join tblCadastro_Curriculo_Incompleto cv on cv.IdCV = cc.idCV
where cv.Ativo = 'S'
and (cv.Sexo = 'M' or cv.Sexo = 'F')
and cv.Excluido = 'N'
and ((YEAR(CURDATE())-RIGHT(REPLACE(cv.DtNascimento, '/', ''),4) >= 16 or (datediff(YEAR(ifnull(date(cv.DataUpdate),date(cv.DataCadastro))),CURDATE()) + YEAR(CURDATE())-RIGHT(REPLACE(cv.DtNascimento, '/', ''),4)) >= 16)
and (YEAR(CURDATE())-RIGHT(REPLACE(cv.DtNascimento, '/', ''),4) <= 97 or (datediff(YEAR(ifnull(date(cv.DataUpdate),date(cv.DataCadastro))),CURDATE()) + YEAR(CURDATE())-RIGHT(REPLACE(cv.DtNascimento, '/', ''),4)) <= 97))
group by cc.CampoConhecimento order by cc.CampoConhecimento asc;
Que em 40s me retorna isso:
Access 53593 42482 8937 2174
ASP 13271 12963 241 67
AutoCad 20740 15637 3335 1768
C 15261 13903 1093 265
CMais 15666 14284 1118 264
Cobol 12826 12670 109 47
CorelDraw 22418 18069 3192 1157
CSS 33043 27538 4350 1155
Dbase 13049 12839 167 43
Delphi 13226 12901 248 77
Dreamweaver 16216 14578 1223 415
Excel 110420 50002 43771 16647
Flash 17492 15713 1370 409
HTML 50819 38377 9210 3232
Java 15566 14204 1092 270
JavaScript 37677 31640 4869 1168
Linux 19782 17101 2141 540
Macintosh 15491 14245 854 392
MSSQLServer 32612 28300 3625 687
MySQL 32499 27919 3786 794
Net 13734 13095 472 167
Oracle 13711 13240 400 71
Outlook 31534 17714 8555 5265
Photoshop 25695 19547 4478 1670
PHP 14189 13439 594 156
PowerPoint 108758 46837 41646 20277
Sharepoint 12803 12657 102 44
Windows 34045 16383 10059 7603
Word 112999 39167 45279 28554
Para esse resultado eu criei os índices:
ALTER TABLE tblCurriculoConhecimento ADD INDEX (idCV,CampoConhecimento,NivelConhecimento);
ALTER TABLE tblCurriculoConhecimento ADD INDEX (CampoConhecimento,idCV);
ALTER TABLE tblCadastro_Curriculo_Incompleto ADD INDEX (Sexo,Ativo,Excluido,DtNascimento,DataUpdate,DataCadastro,Estado,Cidade,TipoDeficiencia,Instituicao,Curso,Dia,Ano,Nome,CPF,Email);
O cv.IdCV é um PRMARY KEY. Eu adicionei no INDEX campos a mais em relação a esta consulta, porque em certos momentos eles serão usados. O EXPLAIN tá me retornando isso:
1 SIMPLE cv index PRIMARY Sexo 1335 null 203349 Using where; Using index; Using temporary; Using filesort
1 SIMPLE cc ref idCV idCV 5 cv.IdCV 4 Using where; Using index
Eu queria saber aonde estou errando. Porque minha index "Sexo" não está sendo usada corretamente. E como posso melhorar isso.
Por favor.
Obrigado,
Discussão (8)
Carregando comentários...