Я пытаюсь получить некоторые улучшения скорости в определенном запросе SELECT. Ситуация такова: Есть (на моих глазах) огромный перекрестный стол. В настоящее время у него около 20 миллионов строк, но я ожидаю, что это будет расти. На основе этой таблицы пересечения мне нужно создать другую таблицу. Для этого мне нужно выполнить следующий запрос:
SELECT hugeCrossingTable.field3, otherTable.field1, hugeCrossingTable.field2 * otherTable.field3 AS someName
FROM hugeCrossingTable
INNER JOIN otherTable ON hugeCrossingTable.field1 = otherTable.field2
Теперь это в настоящее время приводит к примерно миллиону строк. У меня уже есть индексы как по полю1 в 2 таблицах, но по-прежнему требуется 18 минут. Я думал о разделении таблицы, но тогда мне нужно было бы найти способ разделить данные, и поскольку это просто таблица пересечений, ничего не приходит в голову о том, как это сделать.
Любые идеи о том, как это можно оптимизировать?
Спасибо.
По запросу здесь создайте оператор:
CREATE TABLE `hugeCrossingTable` (
`field` int(11) NOT NULL,
`field1` int(11) NOT NULL,
`field2` double(10,5) DEFAULT NULL,
`field3` int(4) DEFAULT NULL,
KEY `field1` (`field1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `otherTable` (
`field` int(10) unsigned NOT NULL AUTO_INCREMENT,
`field1` int(10) unsigned NOT NULL,
`field2` int(10) unsigned NOT NULL,
`field3` decimal(5,2) NOT NULL,
PRIMARY KEY (`field`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
И вывод объяснения:
id, select_type, table , type , possible_keys, key , key_len, ref , rows, Extra
1 , 'SIMPLE' , 'otherTable' , 'ALL', '' , '' , '' , '' , 294 , ''
1 , 'SIMPLE' , 'hugeCrossingTable', 'ref', 'field1' , 'field1', '4' , 'otherTable.field2', 69 , 'Using where'