Автор Тема: Немеряная склейка...  (Прочитано 5051 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dj Fly

  • Simply Dj :-)
  • Постоялец
  • ***
  • Сообщений: 157
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.digitals-pace.com
Немеряная склейка...
« : 16 Сентября 2004, 20:11:10 »
Народ, посоветуйте, как оптимальным образом добиться быстродействия следующего запроса:

Существуют 5 таблиц абсолютно одинаковой структуры:

word varchar(255) - key
id int(11) - key
rating int(11)

Как видите, индексы повешены на два поля - по которым проходится where...

Необходимо получить список тех id из всех 5 таблиц, которые соответствуют каждому из 5 слов

В каких таблицах содержатся искомые слова - известно заранее - это видно из запроса ниже...

В таблицах - в среднем более 50000 записей в каждой из них.

Выполняется следующий запрос:

select srch.53000.id,(srch.53000.rating+srch.52000.rating+srch.51000.rating+srch.50000.rating+srch.49000.rating) from srch.53000,srch.50000,srch.51000,srch.52000,srch.49000 where (srch.53000.word=\'5\' and srch.50000.word=\'2\' and srch.51000.word=\'3\' and srch.52000.word=\'4\' and srch.49000.word=\'1\') and (srch.53000.id=srch.50000.id and srch.53000.id=srch.51000.id and srch.53000.id=srch.52000.id and srch.53000.id=srch.49000.id and srch.50000.id=srch.51000.id and srch.50000.id=srch.52000.id and srch.50000.id=srch.49000.id and srch.51000.id=srch.52000.id and srch.51000.id=srch.49000.id and srch.52000.id=srch.49000.id) order by (srch.53000.rating+srch.52000.rating+srch.51000.rating+srch.50000.rating+srch.49000.rating) desc limit 1500

Результатом без лимита является 25000 рядов.

Быстродействие именно этого запроса - ажных 8 секунд, что абсолютно недопустимо...

EXPLAIN выдаёт минимум операций равный 26000 то есть выходит, что при таком подходе - быстрее уже некуда...

Может есть другой способ получить сей результат быстрее?

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немеряная склейка...
« Ответ #1 : 17 Сентября 2004, 15:36:54 »
Dj Fly
Какая БД?
And no religion too...

Оффлайн Dj Fly

  • Simply Dj :-)
  • Постоялец
  • ***
  • Сообщений: 157
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.digitals-pace.com
Немеряная склейка...
« Ответ #2 : 17 Сентября 2004, 15:40:21 »
MySQL.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немеряная склейка...
« Ответ #3 : 17 Сентября 2004, 15:51:50 »
1. "word varchar(255) - key" - не правильно!
2. Попробуй убрать order и операции сложения. это можно сделать и приложением...
And no religion too...

Оффлайн Dj Fly

  • Simply Dj :-)
  • Постоялец
  • ***
  • Сообщений: 157
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.digitals-pace.com
Немеряная склейка...
« Ответ #4 : 17 Сентября 2004, 15:58:17 »
Выборка ведь идет по полю word (это главный критерий поиска).
Почему ты считаешь что это неправильно?

Насчёт убрать order и sum - из полученных результатов - мы считываем в приложение только 1500 лучших результатов по рейтингу...
А сортиря это в приложении - нам придётся считать все 25000.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немеряная склейка...
« Ответ #5 : 17 Сентября 2004, 16:25:04 »
Dj Fly
1.Ставить на varchar ключь это не правильно!
2.то что ты считываешь в приложение только 1500 строк не говорит о том что БД не обрабатывает 25000.
And no religion too...

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немеряная склейка...
« Ответ #6 : 17 Сентября 2004, 16:25:44 »
Dj Fly
На чем пишется приложение?
And no religion too...

Оффлайн Dj Fly

  • Simply Dj :-)
  • Постоялец
  • ***
  • Сообщений: 157
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.digitals-pace.com
Немеряная склейка...
« Ответ #7 : 17 Сентября 2004, 16:43:15 »
Приложение на PHP.

Цитировать
commander:
1.Ставить на varchar ключь это не правильно! (нарушение второй нормальной формы).


Сорри, сразу не сказали - ведь это MySQL, а в ней слово key - это же индекс...
Ключей как таковых в этой таблице вообще нет...

Цитировать
commander:
2.то что ты считываешь в приложение только 1500 строк не говорит о том что БД не обрабатывает 25000.


Это само собой - но БД быстрее обработает 25000 чем приложение, на считывание 25000 результатов в PHP уйдет пара секунд минимум.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немеряная склейка...
« Ответ #8 : 20 Сентября 2004, 10:27:45 »
Dj Fly
Давай не будем разводить полемику... Советы:
1. Убарать операцию сложения из запроса.
2. Писать приложение на С++: http://www.unixreview.com/documents/s=8989/ur0401a/
3. На своё усмотрение делать сортировку либо в БД либо в приложении...
And no religion too...

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немеряная склейка...
« Ответ #9 : 20 Сентября 2004, 10:28:53 »
Dj Fly
С++:  либо CGI либо модулем...
модулем к апачу будет быстрее...
And no religion too...

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Немеряная склейка...
« Ответ #10 : 20 Сентября 2004, 10:42:24 »
по-моему, тут кто-то слишком раскомандовался...

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Немеряная склейка...
« Ответ #11 : 20 Сентября 2004, 10:44:35 »
Цитировать
Может есть другой способ получить сей результат быстрее?

может и есть.
Одна беда - результата я никакого не увидел.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Немеряная склейка...
« Ответ #12 : 20 Сентября 2004, 11:49:14 »
RomikChef
флайм! не более того...: http://forums.webscript.ru/showthread.php?s=&postid=114330#post114330
 никакого решения...
« Последнее редактирование: 20 Сентября 2004, 11:55:37 от commander »
And no religion too...

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28