Это занимает много времени, потому что это составной столбец, а не столбец таблицы.Столбец name
является результатом выбора регистра, и в отличие от простого выбора с множественным объединением, MySQL должен использовать другой алгоритм сортировки для данных такого типа.
Я говорю здесь по незнанию, ноВы можете сохранить данные во временной таблице, а затем отсортировать их.Это может идти быстрее, поскольку вы можете создавать индексы для него, но это будет не так быстро из-за другого типа хранилища.
ОБНОВЛЕНИЕ 2011-01-26
CREATE TEMPORARY TABLE `short_select`
SELECT U.id AS user_id,C.name AS country,
CASE
WHEN U.facebook_id > 0 THEN CONCAT(F.first_name,' ',F.last_name)
WHEN U.twitter_id > 0 THEN T.name
WHEN U.regular_id > 0 THEN CONCAT(R.first,' ',R.last)
END AS name,
FROM user U LEFT OUTER JOIN regular R
ON U.regular_id = R.id
LEFT OUTER JOIN twitter T
ON U.twitter_id = T.id
LEFT OUTER JOIN facebook F
ON U.facebook_id = F.id
LEFT OUTER JOIN country C
ON U.country_id = C.id
WHERE (CONCAT(F.first_name,' ',F.last_name) LIKE '%' OR T.name LIKE '%' OR CONCAT(R.first,' ',R.last) LIKE '%') AND U.active = 1
LIMIT 100;
ALTER TABLE `short_select` ADD INDEX(`name`); --add successive columns if you are going to order by them as well.
SELECT * FROM `short_select`
ORDER BY 'name'; -- same as above
Помните, что временные таблицы удаляются при прекращении соединения, поэтому у вас нет для их очистки, но вы все равно должны .