Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Оптимальный запрос mysql

73K
24 июля 2011 года
Aleksey Savitsky
1 / / 24.07.2011
Привет! Требуется создать оптимальный запрос вот с такими условиями поиска:

1. Известно, что в таблице более 100 млн. записей.
2. Известно, что пользователь при добавлении своего предложения товара вносит такие данные:
Вид товара (через запятую. например: автомобиль, легковой автомобиль, машина)
Бренд (через запятую. например: ВАЗ, LADA)
Модель (через запятую. Например: 2101, Копейка)
Цена (цифры)
Валюта (а базе хранится таблица валют и курсы валют относительно гривны)
3. Известно, что сортировка базы производится по репутации пользователя (есть таблица отзывов о пользователях, в которой хранятся позитивные и отрицательные отзывы).
4. Известно, что пользователь в поиске указал:
Цена: от 4000 до 5000 долларов США
Строка поиска: ВАЗ 2101

У кого есть какие соображения?
13
24 июля 2011 года
RussianSpy
3.0K / / 04.07.2006
И в чем собственно вопрос состоит? В чем проблема-то? или вы хотите чтобы мы не видя структуры таблиц и индексов написали вам запрос?
8
25 июля 2011 года
mfender
3.5K / / 15.06.2005
2RussianSpy: Нет, батюшка, будьте любезны и напишите ещё и БД с функционалом ))))
518
25 июля 2011 года
Andreika
101 / / 14.02.2003
Хорошо, входные данные известны. А что надо получить на выходе?
13
25 июля 2011 года
RussianSpy
3.0K / / 04.07.2006
Цитата: Andreika
Хорошо, входные данные известны. А что надо получить на выходе?



Интересно где вы тут увидели вводные данные? Тут что указана структура таблиц и индексы? Или вы телепат?

8
25 июля 2011 года
mfender
3.5K / / 15.06.2005
Вводных достаточно. Напрягает фразо «У кого есть какие соображения?»
Вот что пугает.
Вместо попытки разработки слышится странный вопль «А не могли бы вы мне сочинить? А то мне зарплаты не выдадуть!»
И ведь ТЗ вроде ясное, но вот что-то товарищу мешает, и он ломится задать всех ни к чему не обязывающий вопрос: «У кого есть какие соображения?»
Тут или ответьте, пожалуйте, или просто учитесь как вопросы правильно задавать. Ведь такой вопрос подразумевает «я-то знаю, а вам слабО?»
13
25 июля 2011 года
RussianSpy
3.0K / / 04.07.2006
Если речь идет об ОПТИМАЛЬНОМ запросе, то знать структуру таблиц необходимо.
12
25 июля 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: Andreika
Хорошо, входные данные известны. А что надо получить на выходе?


Наивный. Не указаны критерии "оптимальности". Что есть оптимальность? Малое потребление памяти? Может быстрое выполнение запроса? Но на сколько быстро, секунда? минута? полчаса?

369
26 июля 2011 года
Kesano
451 / / 09.10.2007
Насколько мне известно, вроде как не уникальные данные не могут быть индексными...
По-этому всё что есть - это уникальные айдишники... Так что нужно вести рядом отдельную небольшую табличку id-шников + приоритеты и потом уже вынимать... join'ами... Или другими алгоритмами...
12
26 июля 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: Kesano
Насколько мне известно, вроде как не уникальные данные не могут быть индексными...


Неправильно известно. Индекс с уникальностью ни как не связан.
join - не алгоритм.

8
26 июля 2011 года
mfender
3.5K / / 15.06.2005
Цитата: Kesano
Насколько мне известно, вроде как не уникальные данные не могут быть индексными...
По-этому всё что есть - это уникальные айдишники... Так что нужно вести рядом отдельную небольшую табличку id-шников + приоритеты и потом уже вынимать... join'ами... Или другими алгоритмами...


Да господь с тобой! Перечитай теорию реляционных БД. Индексировать можно кудой хочешь, в частности по автоинкременту, коий не может быть unique, но таковым является. Это наиболее явный парадокс всех БД, но он имеет место быть.

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

369
27 июля 2011 года
Kesano
451 / / 09.10.2007
Да, видать я что-то напутал с индексами...
Всё равно, имхо, с таким объёмом базы без таблиц сопряжения не обойтись...
32K
27 июля 2011 года
martynow
30 / / 16.04.2011
Цитата: alekciy
Наивный. Не указаны критерии "оптимальности". Что есть оптимальность? Малое потребление памяти? Может быстрое выполнение запроса? Но на сколько быстро, секунда? минута? полчаса?



Тогда надо начать с постановки задачи. Я бы предложил поставить ее так:
Обязательное условие - получение правильного ответа
Дополнительное условие - быстрый результат поиска


Причем обязательное условие реализуется не так уж и просто.

Цитата: Aleksey Savitsky
Строка поиска: ВАЗ 2101


Если это база данных по автомобилям, то можно ввести кучу полей с характеристиками и тогда запрос типа ВАЗ 2101 можно превратить в запрос по двум полям. Но если это магазин более широкого профиля, тогда сделать поиск по тексту уже сложнее... Один пользователь напишет "vaz2101" другой "21-01 ВАЗ" и т.д.

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

271
27 июля 2011 года
MrXaK
721 / / 31.12.2002
по хорошему тут надо вынести всё в другие таблицы и делать через связь многие ко многим..
типа таблицы
конечный_автомобиль (id, cost, ...),
типы_автомобилей (typeId, name)
бренды (brandId, name)
модели (modelId, name)
пользователи (userId, name, surname, ... rating)
и таблицы связей типа
автомобиль_тип (id, typeId)
автомобиль_бренд (id, brandId)
автомобиль_модель (id, modelId)
автомобиль_юзер (id, userId)
а потом уже можно написать хоть джойнами, хоть вложенными, хоть последовательными
12
30 июля 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: martynow
Один пользователь напишет "vaz2101" другой "21-01 ВАЗ" и т.д.


А кто-то напишет "копейка". А кто-то копье. А кому то зубило нужно. Только ни какого отношения к структуре БД это не имеет. Не нужно смешивать мух с котлетами.

Есть некая общность данных, в данном случае отношение многие-ко-многим в виде объект-свойство. Эта часть имеет отношение к проектированию структуру БД. К примеру, хранить каждое свойство объекта в поле таблицы (вариант любимый drupal-ом), тогда сколько свойств у объекта столько и полей в таблице. Количество таблиц равно количеству объектов. А можно хранить объекты отдельно, свойства отдельно и связывать их через третью таблицу join-ми. А можно свойства вообще сериализовать и хранить в одном поле. Или вообще уйти от реляционной схемы и использовать документо ориентированные решения. Вариантов масса.

Поисковые запрос это поисковый запрос. В нем могут быть ошибки, в нем могут быть жаргонизмы, профессионализмы, сленг. Ни какого отношения к структуру БД это не имеет. Если используются запросы в свободной форме, то в системе нужен анализатор поискового запроса. Но это другой уровень системы, это не уровень структуры БД.

Когда человек понимает, что это два разных уровня приложения, то поставленная задача решается очень легко. Если не получается написать анализатор самому, можно использовать готовые, к примеру тот же Яндекс.Сервер. В конечно итоге не подойдет готовое решение, можно убрать свободный поиск, а пользователю выдавать готовый список возможных значение из которого он выбирает нужный (автомобиль - марка - модель ....).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог