Как выполнить поиск в нескольких таблицах?

WebPHPDev

Новичок
У меня несколько таблиц: table1, table2, table3. У всех есть поле title. Нужно выполнить поиск по этому полю (таблицы не связаны между собой). Подскажите пожалуйста, как оптимально по нагрузке на сервер осуществить поиск по таблицам?
 

WebPHPDev

Новичок
Ищущий "что-то" во всех указанных таблицах. Но не знаю, можно ли как-то произвести сортировку всех полученных данных в том же запросе MySQL? Можно ведь только поотдельности сортировать каждую, а вот как бы все данные глобально просортировать? Но не вытаскивая всё в PHP - иначе накладно, если товаров много. Не подскажите?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Опиши нормально задачу
 

fixxxer

К.О.
Партнер клуба
"Оптимально" - только внешним индексом (ну или генерацией дублирующей таблицы, то есть внешним индексом средствами mysql). Ну или изменить структуру - хранить все тайтлы в отдельной таблице.
А так union select но понятно что это гарантированный filesort.

Это если я правильно вопрос понял
 

WebPHPDev

Новичок
Опиши нормально задачу
У меня есть несколько таблиц с одниковыми полями. Я делаю выборку: SELECT ...table1... UNION SELECT ...table2... UNION SELECT TABLE3
При этом у всех трёх полей есть поле "rating". Я хочу отсортировать эту всю выборку по полю rating. Вот и вопрос - как это сделать? :)
Если я пропишу в во все SELECT'ы - он просортирует каждый, в итоге у меня выходные данные будут отсортированы "локально", но не глобально. Короче вообще они несортированными будут. :)

fixxxer
Да вообще бы запрос составить под текущее положение дел))
 

WebPHPDev

Новичок
Тьфу блин. Нашёл ответ на свой вопрос:
http://www.mysql.ru/docs/man/UNION.html

Если для всего результата UNION необходимо применить оператор ORDER BY, следует использовать круглые скобки:

(SELECT a FROM table_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM table_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10)
ORDER BY a;


Вот функция моей мечты.) filesort действительно появляется. 2 таблицы - суммарно три тестовых строчки в них :) А с чего он появляется? Всегда при ORDER BY или есть способы избавиться от него? Поля, по которым я ищу - всегда одни и те же...
 

Фанат

oncle terrible
Команда форума
Задача у него озвучена в предыдущем вопросе.
100500 таблиц, каждая под свой товар. Есть общие поля - такие, как название и рейтинг.
Хочет вывести список товаров
 

WebPHPDev

Новичок
Задача у него озвучена в предыдущем вопросе.
100500 таблиц, каждая под свой товар. Есть общие поля - такие, как название и рейтинг.
Хочет вывести список товаров
Верно! :) Ответом выше я написал уже решение под эту задачу.. Дальнейшая проблема - можно ли как-то избежать filesort'а в MySQL при таком запросе :)

Тестовый запрос такой:
(SELECT id FROM `products1`)
UNION ALL
(SELECT id FROM `products2`)
ORDER BY id
но и он, к сожалению, прибегает к необходимости filesort'инга. Может как-то можно избежать?
 

itprog

Cruftsman
прибегает к необходимости filesort'инга. Может как-то можно избежать?
Выше уже писали другое решение. А так, если скорость запроса устраивает, то зачем избавляться от этого?
 

fixxxer

К.О.
Партнер клуба
[sql]create table goods ( -- общие поля
id serial primary key,
title varchar(255),
price decimal(10, 2),
rating integer
);

create table goods_foo (
id bigint not null references goods(id),
custom_field1...
);

create table goods_bar (
id bigint not null references goods(id),
custom_field1...
);[/sql]

ну так например можно сделать

upd! верните тэг [sql]!1111
 

~WR~

Новичок
WebPHPDev, посмотри в сторону Sphinx.
Отлично работает для интернет-магазинов с их многочисленными сложными выборками.

Всё равно, по мере роста кол-ва данных, все эти многослойные JOIN и UNION станут слишком тяжелыми для поиска.
А со сфинксом можно об этом вообще не париться.
 

WebPHPDev

Новичок
itprog
Да, в общем-то, действительно, чего мы паримся, если скорость и так устраивает) Я просто подумал так, что filesort - это гарантированное создание файла, выброс туда (моих трёх тестовых строк) и просортировка. Как уже прочёл - filesort означает, почему-то, не всегда присутствие файла для задачи сортировки. Здесь я совершенно не понял когда означает, а когда нет. А изначально думал о том, что не очень целесообразно создавать для трёх строчек - отдельный файл для сортировки, там данных на несколько байт) Для чего тут файлы. Вот и думал - вдруг могу как-то помочь MySQL-серверу)

fixxxer
Спасибо за альтернативный пример решения задачи! Задумаемся на счёт и такой структуры.

~WR~
Спасибо! Присмотрюсь. Это, скорее, будет вариантом "на вырост". Поскольку ещё не знаком с данной технологией, почитал немного о ней - действительно то, что нужно. Освоить бы её теперь и использовать. И чтобы ещё не в ущерб всей скорости написания проекта в целом :)
 
Сверху