Допустим, мне нужно запросить сотрудников корпорации. У меня есть таблица «транзакции», которая содержит данные о каждой сделанной транзакции.
CREATE TABLE `transactions` (
`transactionID` int(11) unsigned NOT NULL,
`orderID` int(11) unsigned NOT NULL,
`customerID` int(11) unsigned NOT NULL,
`employeeID` int(11) unsigned NOT NULL,
`corporationID` int(11) unsigned NOT NULL,
PRIMARY KEY (`transactionID`),
KEY `orderID` (`orderID`),
KEY `customerID` (`customerID`),
KEY `employeeID` (`employeeID`),
KEY `corporationID` (`corporationID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Достаточно просто запросить эту таблицу для ассоциированных сотрудников, но есть один изюминка: запись транзакции регистрируется один раз на сотрудника, поэтому для одной корпорации может быть несколько записей на заказ.
Например, если бы сотрудники А и В из корпорации 1 оба были вовлечены в продажу пылесоса корпорации 2, в таблице «транзакции» было бы две записи; один для каждого сотрудника, и оба для корпорации 1. Однако это не должно влиять на результаты. Сделка от корпорации 1, независимо от того, сколько ее сотрудников было вовлечено, должна рассматриваться как одна.
Полегче, подумал я. Я просто сделаю соединение на производной таблице, вот так:
SELECT corporationID FROM transactions JOIN (SELECT DISTINCT orderID FROM transactions WHERE corporationID = 1) AS foo USING (orderID)
Запрос возвращает список корпораций, которые участвовали в сделках с корпорацией 1. Это именно то, что мне нужно, но он очень медленный, потому что MySQL не может использовать индекс corporationID для определения производной таблицы. Я понимаю, что это относится ко всем подзапросам / производным таблицам в MySQL.
Я также пытался запросить коллекцию orderID отдельно и использовать смехотворно большое предложение IN () (как правило, 100 000+ идентификаторов), но, как оказалось, MySQL имеет проблемы с использованием индексов для смехотворно больших предложений IN () в ну и в результате время запроса не улучшается.
Есть ли другие доступные варианты, или я исчерпал их обоих?