¿Puede tener una cláusula WHERE con un operador más grande que el operador en una llave compuesta?
-
16-10-2019 - |
Pregunta
Soy un desarrollador web (¡no administrador de DB!) Teniendo problemas de rendimiento procesando una tabla de registro de 1.7m en MySQL. Aquí está esa tabla:
CREATE TABLE `bbcmapimp_pc_raw` (
`postcode` char(8) NOT NULL,
`pc_sector` char(6) DEFAULT NULL,
`pc_district` char(4) DEFAULT NULL,
`pc_area` char(2) DEFAULT NULL,
`parliamentary_constituency_code` char(9) DEFAULT NULL,
`parliamentary_constituency` varchar(255) DEFAULT NULL,
`mp_name` varchar(255) DEFAULT NULL,
`district_code` char(4) DEFAULT NULL,
`district` varchar(45) DEFAULT NULL,
`country` varchar(255) DEFAULT NULL,
`suffix` char(5) DEFAULT NULL,
PRIMARY KEY (`postcode`),
KEY `pcc` (`parliamentary_constituency_code`),
KEY `suffix_index` (`pc_area`,`suffix`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Solo necesito iterar la mesa, ¡pero en mi primer intento usé Offset, lo cual fue horrible! Desde entonces aprendí lo que MySQL estaba haciendo bajo el capó, y entendí por qué se estaba volviendo cada vez más lento.
Por lo tanto, estoy tratando de modificar mi consulta para usar una cláusula Where Where, pero el problema es que estoy ordenando la consulta por dos campos (la tabla tiene un índice compuesto definido).
Una solución sería agregar un campo de identificación que esté en el orden correcto y usarlo; Pero me preguntaba si había alguna forma en que pudiera especificar ambos campos del índice compuesto en una sola cláusula más grande que Where.
Solución
Puedes usar
SELECT *
FROM `bbcmapimp_pc_raw`
WHERE (`pc_area`,`suffix`) > ('FO', 'BAR')
ORDER BY `pc_area`,`suffix`
Aunque en realidad esto parece tener un mejor plan explicar
SELECT *
FROM `bbcmapimp_pc_raw`
WHERE `pc_area` >= 'FO' AND (`pc_area` > 'FO' OR `suffix` > 'BAR')
ORDER BY `pc_area`,`suffix`