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

(Resolvido) SQL não utiliza index criado


shakall

Pergunta

Galera possuo a seguinte estrutura de tabela abaixo, esta tabela guarda posições gps dos veiculos, hoje está 800mil registros.

Como pode ver no codigo possuo os index para as colunas nrlat e nrlog, mas ao testar o seguinte sql abaixo ele não utiliza o index, e faz a busca em todos os registros.

alguém sabe me dizer o que estou fazendo de errado para ele ignorar o index?

select * from posicao_gps where nr_lat=-19.68916
"SQ_POSICAO_GPS";"SQ_VEICULO";"CD_EMPRESA";"SQ_DISPOSITIVO_VEICULO";"DT_POSICAO";"NR_ANTENA_RASTREAMENTO";"NR_LAT";"NR_LOG";"DS_POSICAO";"ID_IGNICAO";"VL_VELOCIDADE";"STATUS"
"3bad5ba72dcceea4012dcd56a200016a";"4926";"17";"232";"2011-01-28 13:55:14";NULL;"-19.68916";"-47.99126";"Uberaba - MG";"L";"76";"V"


explain select * from posicao_gps where nr_lat=-19.68916
"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra"
"1";"SIMPLE";"posicao_gps";"ALL";"Index 8";NULL;NULL;NULL;"823250";"Using where"
CREATE TABLE `posicao_gps` (
    `SQ_POSICAO_GPS` VARCHAR(36) NOT NULL,
    `SQ_VEICULO` INT(11) NULL DEFAULT NULL,
    `CD_EMPRESA` INT(6) NULL DEFAULT NULL,
    `SQ_DISPOSITIVO_VEICULO` BIGINT(19) NULL DEFAULT NULL,
    `DT_POSICAO` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `NR_ANTENA_RASTREAMENTO` BIGINT(20) NULL DEFAULT NULL,
    `NR_LAT` VARCHAR(50) NOT NULL,
    `NR_LOG` VARCHAR(50) NOT NULL,
    `DS_POSICAO` VARCHAR(400) NULL DEFAULT NULL,
    `ID_IGNICAO` VARCHAR(1) NULL DEFAULT NULL,
    `VL_VELOCIDADE` FLOAT NULL DEFAULT NULL,
    `STATUS` VARCHAR(1) NOT NULL DEFAULT 'V',
    PRIMARY KEY (`SQ_POSICAO_GPS`),
    INDEX `Ref_90` (`SQ_VEICULO`),
    INDEX `Ref_91` (`CD_EMPRESA`),
    INDEX `IDX-DTPOSICAO-SQVEICULO-CDEMPRESA` (`DT_POSICAO`, `SQ_VEICULO`, `CD_EMPRESA`),
    INDEX `SQ_DISPOSITIVO_VEICULO` (`SQ_DISPOSITIVO_VEICULO`),
    INDEX `index 7` (`SQ_VEICULO`, `DT_POSICAO`),
    INDEX `status` (`STATUS`),
    INDEX `Index 8` (`NR_LAT`),
    INDEX `Index 9` (`NR_LOG`),
    CONSTRAINT `FK_posicao_gps_dispositivo_veiculo` FOREIGN KEY (`SQ_DISPOSITIVO_VEICULO`) REFERENCES `dispositivo_veiculo` (`SQ_DISPOSITIVO_VEICULO`) ON UPDATE NO ACTION ON DELETE NO ACTION,
    CONSTRAINT `Ref_90` FOREIGN KEY (`SQ_VEICULO`) REFERENCES `veiculo` (`SQ_VEICULO`) ON UPDATE NO ACTION ON DELETE NO ACTION,
    CONSTRAINT `Ref_91` FOREIGN KEY (`CD_EMPRESA`) REFERENCES `empresa` (`CD_EMPRESA`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
Galera possuo a seguinte estrutura de tabela abaixo, esta tabela guarda posições gps dos veiculos, hoje está 800mil registros.

Como pode ver no codigo possuo os index para as colunas nrlat e nrlog, mas ao testar o seguinte sql abaixo ele não utiliza o index, e faz a busca em todos os registros.

alguém sabe me dizer o que estou fazendo de errado para ele ignorar o index?

explain select * from posicao_gps where nr_lat=-19.68916
"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra"
"1";"SIMPLE";"posicao_gps";"ALL";"Index 8";NULL;NULL;NULL;"823250";"Using where"
Oi 'shakall', Carreguei sua tabela em minha base de testes e apliquei testes com a latitude no formato numérico (como você passou). Ele não usou o índice apesar de ter informado que há um índice possível (Index 8) No formato caracter (formato de definição do atributo na tabela), ele retornou usando o índice Index 8. O erro está na forma como você se referenciou a constante (-19.68916) na cláusula where. Para manter do jeito que você colocou (com constante no formato numérico) você deverá forçar o uso do índice com a cláusula USE INDEX (nomedoindice) assim:
explain 
select * 
from posicao_gps USE INDEX (`Index 8`)
where nr_lat= -19.68916;
Porém o uso de
explain 
select * 
from posicao_gps
where nr_lat= '-19.68916';

é mais eficiente.

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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...