2013-12-17 2 views
0
Schema: 
CALL (ID,USER_ID(Foreign key),SP_USER_ID(Foreign key)) 
USER (ID,NAME) 

Запрос 1:Соедините 2 столбца из таблицы 1 (внешний ключ) с таблицей 2 (первичный ключ). Как избежать JOIN BUFFER?

SELECT u.name, 
     v.name 
FROM call c 
     INNER JOIN USER u 
       ON c.user_id = u.id 
     INNER JOIN USER v 
       ON c.sp_user_id = v.id 

Запрос 2:

SELECT u.name 
FROM call c 
     INNER JOIN USER u 
       ON c.user_id = u.id 

Query 2 работает отлично, и результаты приходят слишком быстро.

Но запрос 1 занимает много времени, и иногда клиентский клиент MySQL падает (видя план объяснения, он показывает «JOIN BUFFER» для одной из таблиц USER).

«где» условие на SP_USER_ID или USER_ID несколько дает результаты быстро, но оно не находится в допустимом диапазоне. «Где» условие для других столбцов не имеет никакого эффекта.

Как избежать JOIN BUFFER, чтобы получить более быстрый результат в этом случае и получить желаемые результаты либо путем объединения, либо каким-либо другим способом?

+0

У вас есть три стола или две таблицы? У вас есть еще одна таблица для Super_User? –

+0

Нет. Только 2 таблицы. Таблица CALL и USER.USER имеет всю информацию о пользователе. USER_ID в CALL подобен идентификатору клиента, а идентификатор SP_USER_ID в CALL - это идентификатор человека, который обслуживает/обслуживает этого клиента. Теперь мне нужно присоединитесь к таблице USER, чтобы получить имя как USER_ID, так и SP_USER_ID. – user104309

ответ

1

Надеюсь, что есть индекс над колонкой USER_ID, а не более SP_USER_ID. Следовательно, он выбирает для JOIN BUFFER.

Согласно документации, А JOIN BUFFER используется только тогда, когда присоединиться к типу ALL или index (другими словами, когда никакие возможные ключи не могут быть использованы).

http://dev.mysql.com/doc/internals/en/join-buffer-size.html

+0

У меня есть индексы как для USER_ID, так и для SP_USER_ID. Даже наличие индексов на этих двух столбцах мне не помогает. – user104309

Смежные вопросы