Можете ли вы иметь пункт, где с оператором больше, чем на композитном ключе?

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

Вопрос

Я веб -разработчик (а не администратор DB!) Имею проблемы с производительностью, обрабатывая 1,7 -метровую таблицу записей на MySQL. Вот эта таблица:

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;

Мне просто нужно повторить стол, но в моей первой попытке я использовал смещение, которое было ужасным! С тех пор я узнал, что делал MySQL под капотом, и понял, почему он становится медленнее и медленнее.

Итак, я пытаюсь изменить свой запрос, чтобы вместо этого использовать предложение, но проблема в том, что я заказываю запрос двумя полями (таблица имеет определенный композитный индекс).

Одним из решений было бы добавить поле идентификатора, которое находится в правильном порядке, и использовать его; Но мне было интересно, был ли какой -нибудь способ указать оба поля композитного индекса в одном большем, чем в предложении?

Это было полезно?

Решение

Вы можете использовать

SELECT *
FROM `bbcmapimp_pc_raw`
WHERE (`pc_area`,`suffix`) > ('FO', 'BAR')
ORDER BY `pc_area`,`suffix`

Хотя на самом деле это, кажется, лучше объяснить план

SELECT *
FROM `bbcmapimp_pc_raw`
WHERE `pc_area` >= 'FO' AND (`pc_area` > 'FO' OR `suffix` > 'BAR')
ORDER BY `pc_area`,`suffix`
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top