¿Puede tener una cláusula WHERE con un operador más grande que el operador en una llave compuesta?

dba.stackexchange https://dba.stackexchange.com/questions/11061

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.

¿Fue útil?

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`
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top