2016-08-08 2 views
-1
SELECT * FROM inv, clients 
WHERE inv.client_id = clients.ID 
AND  (inv.type = "STA" 
OR  inv.type = "FIN") 

ИЛИКакой запрос более быстрый и менее избыточный в mySQL innoDB?

SELECT * FROM invoice, clients 
WHERE inv.client_id = clients.ID 
AND MATCH (inv.type) AGAINST ("STA FIN") 

Я знаю, что эти 2 вопроса, но, возможно, они идут вместе

+0

Почему этот вопрос ниспроверг? Разве не имеет смысла отвечать на вопросы, чем играть в полицию? – Ben

ответ

0

Короткий ответ: Используйте inv.type IN ("STA", "FIN") и INDEX(client_id, type).

Длинный ответ:

MATCH...AGAINST ужасно медленно, если у вас есть FULLTEXT индекс type. Однако это неправильное использование FULLTEXT, поэтому я не рекомендую его.

AND (inv.type = "STA" OR inv.type = "FIN") автоматически превращается в AND inv.type IN ("STA", "FIN"), что достаточно быстро. Если есть INDEX(type), он может использовать этот индекс и быть очень быстрым. Полезность этого зависит от мощности - «тип» звучит как столбец с очень небольшим количеством значений, поэтому индекс может быть бесполезным.

Другой вопрос: Не используйте устаревшие "commajoin", используйте JOIN...ON:

SELECT * 
    FROM invoice 
    JOIN clients ON inv.client_id = clients.ID -- How the tables relate 
    WHERE inv.type IN ("STA", "FIN") -- filtering 

Вы должны

inv: INDEX(client_id, type) 

С помощью этого 'композит' индекс берет на себя как ON и ГДЕ, избегая, как я упоминал выше, проблемы с низкой мощностью.

+0

тип действительно имеет только 4 разных термина, каждый из 3 символов. Итак, поиск FULLTEXT бесполезен. Я продолжу это, спасибо – Ben

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