Разница в производительности составляет возможно из-за того, что e.id_dernier_fichier
находится в индексе, используемом для JOIN, но e.codega
не находится в , что index .
Без полного определения обеих таблиц и всех их индексов невозможно сказать наверняка. Также может помочь включение двух ПЛАНОВ ОБЪЯСНЕНИЯ для двух запросов.
Однако сейчас я могу остановиться на нескольких вещах ...
Если ИНДЕКС КЛАСТЕРНЫЙ (это также относится к ПЕРВИЧНЫМ КЛЮЧАМ), данные фактически физически сохраняются в порядке ИНДЕКСА. Это означает, что зная, что вы хотите положение x в INDEX, также бездействие означает, что вы хотите положение x в таблице.
Однако, если INDEX не кластеризован, INDEX просто предоставляет вам поиск. Фактически говоря, позиция x в INDEX соответствует позиции y в таблице.
Важное значение здесь имеет доступ к полям, не указанным в INDEX. Это означает, что вы действительно должны пойти в ТАБЛИЦУ, чтобы получить данные. В случае КЛАСТЕРНОГО ИНДЕКСА, вы уже там, накладные расходы на поиск этого поля довольно низкие. Однако, если ИНДЕКС не кластеризован, вам эффективно нужно присоединить СТОЛ к ИНДЕКСУ, а затем найти интересующее вас поле.
Примечание; Наличие составного индекса на (id_dernier_fichier, codega)
очень отличается от наличия одного индекса на (id_dernier_fichier)
и отдельного индекса на (codega)
.
В случае вашего запроса, я не думаю, что вам вообще нужно менять код. Но вы можете получить выгоду от изменения индексов.
Вы упоминаете, что хотите получить доступ к многим полям. Поместить все эти поля в составной индекс, пожалуй, не лучшее решение. Вместо этого вы можете захотеть создать CLUSTERED INDEX для (id_dernier_fichier)
. Это будет означать, что после определения * id_dernier_fichier * вы уже в нужном месте, чтобы получить все остальные поля.
РЕДАКТИРОВАТЬ Примечание о индексах MySQL и CLUSTERED
13.2.10.1. Кластерные и вторичные индексы
Каждая таблица InnoDB имеет специальный индекс, называемый кластеризованным индексом, в котором хранятся данные для строк:
- Если вы определяете ПЕРВИЧНЫЙ КЛЮЧ в своей таблице, InnoDB использует его в качестве кластеризованного индекса.
- Если вы не определили PRIMARY KEY для своей таблицы, MySQL выберет первый индекс UNIQUE, который имеет только столбцы NOT NULL, в качестве первичного ключа, а InnoDB использует его в качестве кластеризованного индекса.
- Если в таблице нет PRIMARY KEY или подходящего индекса UNIQUE, InnoDB внутренне создает скрытый кластеризованный индекс в синтетическом столбце, содержащем значения идентификатора строки. Строки упорядочены по идентификатору, который InnoDB присваивает строкам в такой таблице. Идентификатор строки представляет собой 6-байтовое поле, которое монотонно увеличивается при вставке новых строк. Таким образом, строки, упорядоченные по идентификатору строки, физически находятся в порядке вставки.