Я пытаюсь понять, можно ли использовать индекс в объединении, если нет ограничений, где на первой таблице.Используйте индекс в соединении без «где»
Примечание: это не линейное использование в реальном масштабе времени, а просто вещь, которую я собираю вместе для понимания целей. Не указывайте на очевидное «что вы пытаетесь получить с помощью этой схемы?», «Вы должны использовать UNSIGNED» или «понравится», потому что это не вопрос.
Примечание2: это MySQL JOINS without where clause так или иначе связаны, но не то же самое
Схема:
CREATE TABLE posts (
id_post INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
text VARCHAR(100)
);
CREATE TABLE related (
id_relation INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_post1 INT NOT NULL,
id_post2 INT NOT NULL
);
CREATE INDEX related_join_index ON related(id_post1) using BTREE;
Запрос:
EXPLAIN SELECT * FROM posts FORCE INDEX FOR JOIN(PRIMARY) INNER JOIN related ON id_post=id_post1 LIMIT 0,10;
SQL Скрипки: http://sqlfiddle.com/#!2/84597/3
Как вы можете видеть, индекс используется во второй таблице, но th e движок делает полное сканирование таблицы на первом (FORCE INDEX - это просто для выделения общего вопроса).
Я хотел бы понять, можно ли также получить «ref» с левой стороны.
Спасибо!
Update: если первая таблица имеет значительно больший показатель, чем вторая, вещь замена: двигатель использует индекс для первого и полного сканирования таблицы для второго http://sqlfiddle.com/#!2/3a3bb/1 не менее, никакого способа получить индексы не используется на обоих.
Возможно, это поможет: http://dev.mysql.com/doc/refman/5.5/ru/how-to-avoid-table-scan.html – EternalHour
Также прочитайте этот ответ по аналогичному вопросу: http: /stackoverflow.com/questions/27897763/mysql-explain-showing-all-type-although-index-exists/27899245#27899245 – axiac