![]() |
|
Модераторы: skyboy |
![]()
|
|
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
Суть проблемы такова: есть сайт, на котором крутится база. В базе десяток таблиц со сложной структурой связи "один к одному". Связь осуществляется стандартно, через ID.
На одной из страниц используется сложный запрос для выборки всех элементов, совпадающих с тем, имеющих то-то и то-то. Короче, в запросе используется четыре left join по четырем различным таблицам + пятая таблица как первоначальная сложное условие и group by по двум полям. Две из пяти таблиц имеют несколько десятков тысяч записей. Естественно, что результаты выводятся постранично, и на каждой странице мне необходимо знать общее количество получаемых строк, прежде чем выбрать нужные значения и еще показать меню с переходом на другие страницы. Работает суммирование относительно медленно, даже на докалном серваке с иксами. Понятно,Ючто на хостинге на одного клиента будет приходится еще больше тормозов. Так запрос вида
для результута в двадцать тысяч строк обрабатывается первый раз порядка трех секунд. Если бы я мог предварительно оценить, что результат содержит очень большое кол-во строк, то вместо их постраничного представления я могу заставить пользоватля ужесточить сузить критерии поиска. Но для этого мне необходимо знать, что кол-во строк будет превышать некоторую пороговую величину. Отсюда вопрос: можно ли модифицировать приведенный запрос так, чтоб сервер БД не выполнял подсчет всех строк, а только указал, что они превышают некоторую величину. Пока что ситуация получается следующая: гораздо легче выбрать скажем первые тысячу строк вот так:
Результат - выборка из 1000 строк выполняется всего за 0.23 секунды. Т.е, я знаю, что как минимум тысяча строк результата у меня есть. Но, если задуматься - выход крайне идиотский: все эти тысячи строк результата могут где-то буферизироваться, хотя они мне в этом сеансе связи не понадобятся. Беспокоюсь потому, что хостинг типичный - то есть не на своем железе, а просто этот сервер у хостера держит еще другие сайты и с каждым новым посетителем ресурсов может недоставать заметно сильнее. Это сообщение отредактировал(а) DENNN - 30.9.2005, 15:14 |
||||
|
|||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Ну вообще-то у сервера телепатические способности отсутствуют - он способне только посчитать, сравнить и выдать результат.
Вот ЭТОГО я понять не способен в принципе. Связь 1:1 оправдана очень редко - только при наличии в таблице части редко используемых данных их имеет смысл выносить в такую связанную таблицу. Применительно к твоему вопросу - что мешает вместо жуткообразной сложной структуры связей собрать все в одну таблицу? или ты что-то сильно недоговариваешь... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
Ну вообще-то ты недопонимаешь. Для того чтоб подсчитать все строки, нужно найти все строки, удовлетворяющие указанному условию. То есть перебрать все строки, инкременируя счетчик на каждой (это простейший, не оптимальный алгоритм). Но мне не нужно пересчитывать 20000 строк, достточно при достижении счетчика скажем 1000 остановиться. Т.е. в моем примере вместо затрачивания 3 секунд хватило бы и 0.3 секунды.
Скорей запутался в терминологии. Например, есть таблица, содержащая запись о каждом офисе. Есть таблица, содержащая запись видов банковских услуг. А есть таблица содержащая два поля: ID офиса и ID услуги. Т.е. если офис оказывает 10 видов услуг, то в этой таблице будет десять записей с идентификатором этого офиса. Добавлено @ 18:06 P.S. Не надо говрить, что это не нужно. Вот например в STL есть масса алгоритмов частичной сортировки, частичного перебора и т.д как раз для побобных задач, когда нет необходимости перетряхивать весь контейнер. |
||||
|
|||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
У Мускула нет такого механизма... то есть можно посмотреть как именно работает LIMIT - но мне кажется что сперва все одно получаем всю выборку.
Это нормально. Но это совсем даже не 1:1. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
Akina LIMIT не выход. Я выдаю запросы по 30 на страницу, а время выполнения как у всех сразу
|
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Secandr
Не, ну делай временную таблицу на текущий ID совокупности реквизитов - первый запрос будет долгий (как, впрочем, в любой мощной системе поиска), а листание по страницам - быстрое. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
Для вебтехнологий это автоматически означает необходимость persistent connection вместо обычного (иначе временные таблицы удалятся после разрыва соединения). Это сообщение отредактировал(а) DENNN - 3.10.2005, 12:44 |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
не-а... как организовать... просто добавляется 1) таблица реквизитов запроса 2) статические таблицы выборок по этим запросам. Первым делом выполняется проверка, нет ли ЭТИХ реквизитов в таблице реквизитов запроса. Если есть - просто берется необходимая таблица выборки. А вот если нет - то делается выборка в новую статическую таблицу, и реквизиты заносятся в таблицу реквизитов. При необходимости (достижение порога по кол-ву или объему) удаляется самая старая таблица выборки и соотв. ей строка таблицы реквизитов. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
Akina когда писал пост, я об этом подумал. Хотя не всё то долото, что блестит.
База обновляется быстро - стол заявок. Хранить запросы имеет смысл только для одной сессии, слава богу что время посещения строго запоминается |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 2 Всего: 43 |
Фигня какя-то получается для выборки из нескольких таблиц. Потому что варианты запросов самые разные и хранить выбоорку из 20 тысяч строк примерно так для 2-3 тысяч вариантов выборок - на кой тогда БД нужна? Я же каким-нибудь движком могу раз в 2-3 часа сотню тысяч HTML страниц сгенерить - все проще Это сообщение отредактировал(а) DENNN - 3.10.2005, 17:17 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |