ВЫБРАТЬ... В ОФФЕКТИВНОМ исполнении

Я пытаюсь оптимизировать процесс экспорта запроса. У меня есть следующие таблицы (я опускаю некоторые не относящиеся к делу поля):

CREATE TABLE _termsofuse (
    ID int(11) NOT NULL AUTO_INCREMENT, TTC_ART_ID int(11) DEFAULT NULL,
    TTC_TYP_ID int(11) DEFAULT NULL,
    TERM_OF_USE_NAME varchar(200) DEFAULT NULL,
    TERM_OF_USE_VALUE varchar(200) DEFAULT NULL,
    PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=185905671 DEFAULT CHARSET=utf8;
CREATE TABLE vehicle ( ID mediumint(8) unsigned NOT NULL AUTO_INCREMENT, TTC_TYP_ID int(11) unsigned NOT NULL, PRIMARY KEY (ID), UNIQUE KEY TTC_TYP_ID_UNIQUE (TTC_TYP_ID) ) ENGINE=InnoDB AUTO_INCREMENT=44793 DEFAULT CHARSET=utf8;
CREATE TABLE part ( ID int(11) unsigned NOT NULL AUTO_INCREMENT, TTC_ART_ID int(11) unsigned NOT NULL, PRIMARY KEY (ID), UNIQUE KEY TTC_ART_ID_UNIQUE (TTC_ART_ID) ) ENGINE=InnoDB AUTO_INCREMENT=3732260 DEFAULT CHARSET=utf8;
CREATE TABLE term_of_use_name ( ID smallint(5) unsigned NOT NULL AUTO_INCREMENT, ID_Lang tinyint(3) unsigned NOT NULL, Name varchar(200) NOT NULL, PRIMARY KEY (ID, ID_Lang), UNIQUE KEY Name_Lang_UNIQUE (Name, ID_Lang), KEY fk_term_of_use_name_lang_id_lang_idx (ID_Lang), CONSTRAINT fk_term_of_use_name_lang_id_lang FOREIGN KEY (ID_Lang) REFERENCES lang (ID) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=732 DEFAULT CHARSET=utf8;
CREATE TABLE term_of_use_value ( ID mediumint(8) unsigned NOT NULL AUTO_INCREMENT, ID_Lang tinyint(3) unsigned NOT NULL, Value varchar(200) NOT NULL, PRIMARY KEY (ID,ID_Lang), UNIQUE KEY Value_Lang_UNIQUE (Value,ID_Lang), KEY fk_term_of_use_value_lang_id_lang_idx (ID_Lang), CONSTRAINT fk_term_of_use_value_lang_id_lang FOREIGN KEY (ID_Lang) REFERENCES lang (ID) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=887502 DEFAULT CHARSET=utf8;
Теперь я пытаюсь выбрать несколько столбцов в CSV-файл. После этого я импортирую файл в таблицу базы данных, но подозреваю, что это не должно занять слишком много времени. Мой выбор Select следующий:

SELECT DISTINCT vehicle.ID, part.ID, term_of_use_name.ID, term_of_use_value.ID FROM _termsofuse
INNER JOIN vehicle ON vehicle.TTC_TYP_ID = _termsofuse.TTC_TYP_ID
INNER JOIN part ON part.TTC_ART_ID = _termsofuse.TTC_ART_ID
INNER JOIN term_of_use_name ON term_of_use_name.Name = _termsofuse.TERM_OF_USE_NAME AND term_of_use_name.ID_Lang = 2
INNER JOIN term_of_use_value ON term_of_use_value.Value = _termsofuse.TERM_OF_USE_VALUE AND term_of_use_value.ID_Lang = 2
INTO OUTFILE 'termsofuse.csv'
CHARACTER SET utf8
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n';
Этот запрос занимает больше 8 часов на моем ноутбуке (у меня 4 ГБ ОЗУ). Я попытался увидеть объяснение части SELECT, и она показывает следующее: Объясните заявление

Я не понимаю, где именно узкое место. Я экспортировал аналогичный (около 95 миллионов записей) запрос менее чем за 1 час. Также разбивая результаты на несколько таблиц, используя limit кажется, не очень помогает... Пожалуйста, посмотрите и любую дополнительную информацию, которую вам требуется, просто скажите мне. Заранее спасибо.
РЕДАКТИРОВАТЬ 15/01/2016
Результаты Explain Select

1 ответ

Почему есть ID когда у тебя совершенно хорошо UNIQUEINT это может быть ПК?

Серьезно - необходимость доступа через вторичный ключ замедляет процесс. Если каждый поиск замедляет его в 2 раза, это может сложиться.

Сколько у вас оперативной памяти? Какова стоимость innodb_buffer_pool_size? Должно быть около 70% доступной оперативной памяти.

Давайте посмотрим EXPLAIN SELECT ...; там может быть больше подсказок.

Другие вопросы по тегам