Tive problemas com algumas consultas de IP geográfico. Então basicamente aqui está o código de criação da tabela:
CREATE TABLE `geo_ip_city` (
`id` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`begin` BIGINT(20) NOT NULL DEFAULT '0',
`end` BIGINT(20) NOT NULL DEFAULT '0',
`code` VARCHAR(2) NOT NULL DEFAULT '',
`city` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
INDEX `begin` (`begin`),
INDEX `end` (`end`),
INDEX `code` (`code`)
)
E consultar:
SELECT * FROM `geo_ip_city` USE INDEX ( `end` ) WHERE `begin` <= 2523596988 AND `end` >= 2523596988 LIMIT 1
O tamanho da tabela é de cerca de 4,5 milhões de registros.
Essa consulta é executada quando todos os outros critérios não funcionam, mas ainda em horários de pico com bastante frequência.
No pior cenário (onde nada foi encontrado), ele é executado por 1,9444 segundos.
Aqui está explicado:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE geo_ip_city range end end 8 NULL 2297506 Using index condition; Using where
Então, quando tenho muitos pedidos para esse recurso, meus servidores ficam loucos.
Pergunta:
Posso fazer algo com esta tabela ou consulta para aumentar o desempenho (talvez particionamento ou chaves complexas)? Ou devo assistir de alguma outra forma?