2013-12-19 4 views
2

Итак, у нас есть две таблицы в двух базах данных: db1 и table1 и db2 и table2. Тем не менее, попытка сделать LEFT JOIN на них занимает три минуты. Безумный, я знаю.MySQL LEFT JOIN slow, индекс не используется

SELECT * FROM `db1`.`table1` AS a LEFT JOIN `db2`.`table2` AS b ON a.col=b.col 

a - около 14 000 строк. b - около 825 000 строк.

У нас есть col как a, так и b с индексированием. col, в обоих случаях, VARCHAR(16) с latin1_swedish_ci сопоставление.

Запуск ОБЪЯСНИТЬ

EXPLAIN SELECT * FROM `db1`.`table1` AS a LEFT JOIN `db2`.`table2` AS b ON a.col=b.col 

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

1 SIMPLE a ALL NULL NULL NULL NULL 14174 
1 SIMPLE b ALL NULL NULL NULL NULL 824687 

Однако, я не понимаю, почему это происходит и как это исправить. Присоединение b к другим таблицам, которые намного больше работают за считанные секунды, и индексирование соответствующим образом используется. Что происходит в этом случае и какие шаги я должен предпринять, чтобы исправить это?

ответ

1

Вы выбираете каждый столбец из каждого стола. Поля Varchar неэффективны для индексации, противостоящих индексу первичного ключа. Ваш индекс должен находиться на полях, в которые вы присоединяетесь, иначе они бесполезны, кроме эффективности поиска.

SELECT col, col4, col5, col6 FROM `db1`.`table1` AS a LEFT JOIN (SELECT col,col1, col2, col3 from `db2`.`table2` order by 1,2,3) AS b ON a.col=b.col 

Если вы вступите на суб-запрос, который будет только извлечь столбцы, необходимые которая позволит ускорить производительность значительно, а также создать индекс с Вашим заказом по 1,2,3 в конце подзапрос.

Вы должны включить поле, которое будет соединяющую на в подзапрос также ...

ОТВЕТ

Это не будет иметь смысл использовать индекс для вашего запроса, потому что вы выбрав полный текстовый столбец. Это означает, что MySQL не может использовать только один индекс для удовлетворения запроса.

+1

также вы можете использовать FORCE_INDEX, чтобы указать индекс для MySQL –

+0

@SamD 'FORCE INDEX' не привел к использованию используемого индекса. – MirroredFate

+0

@MirroredFate как насчет SELECT * FROM table1 USE INDEX (col1_index, col2_index) –