Можете ли вы иметь пункт, где с оператором больше, чем на композитном ключе?
-
16-10-2019 - |
Вопрос
Я веб -разработчик (а не администратор 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`