Вернуться   Форум SAPE.RU > Общие вопросы > Разработка и сопровождение сайтов

-->
Ответ
 
Опции темы
Старый 11.07.2009, 17:53   #1
Специалист
 
Регистрация: 18.05.2009
Сообщений: 176
Вес репутации: 190
Zergalius - как роза среди колючекZergalius - как роза среди колючекZergalius - как роза среди колючекZergalius - как роза среди колючек
Отправить сообщение для Zergalius с помощью ICQ
Question запрос в mysql

Есть запрос:
PHP код:
SELECT `i0`, `i2`, `i4`, `i5`, `i6`, `i7`, `i8`, `i9FROM `itemsWHERE `i1LIKE '%$catalog%' ORDER BY rand() LIMIT $num 
Делает выбор $num числа случайных записей из таблицы `items` где поле `i1` содержит определённый текст.
Вроде всё просто, но я не гуру в mysql запросах и оказалось что запрос грузит сервер mysql.

Как оптимизировать?
Zergalius вне форума   Ответить с цитированием
Старый 11.07.2009, 18:09   #2
Специалист
 
Регистрация: 05.06.2008
Адрес: Betelgeize
Сообщений: 247
Вес репутации: 206
edne - это имя известно всемedne - это имя известно всемedne - это имя известно всемedne - это имя известно всемedne - это имя известно всемedne - это имя известно всем
По умолчанию

Избавиться от like.
Такую структуру грех оптимизировать - переделывать надо всё
edne вне форума   Ответить с цитированием
Старый 11.07.2009, 19:11   #3
Специалист
 
Регистрация: 16.03.2008
Сообщений: 256
Вес репутации: 205
sVs скоро станет известенsVs скоро станет известен
По умолчанию

ORDER BY RAND() - совсем не хорошо, RAND() даст случайное число 0....1 и смысла в Вашем запросе нет,
лучше сделайте двумя запросами (или вложенным запросом):
1) сначала посчитайте общее число записей по Вашему условию:
всего_записей = SELECT COUNT(1) FROM `items` WHERE `i1` LIKE '%$catalog%'
2) потом выберите нужное количество записей подряд, зная общее кол-во записей
SELECT bla-bla-bla... FROM `items` WHERE `i1` LIKE '%$catalog%' LIMIT RAND(всего_записей - требуется_записей), требуется_записей

Если это не подходит, то читаем предыдущий совет от edne, с которым я полностью согласен, LIKE - это зло в случае большого количества записей
sVs вне форума   Ответить с цитированием
Старый 11.07.2009, 20:17   #4
Специалист
 
Регистрация: 18.05.2009
Сообщений: 176
Вес репутации: 190
Zergalius - как роза среди колючекZergalius - как роза среди колючекZergalius - как роза среди колючекZergalius - как роза среди колючек
Отправить сообщение для Zergalius с помощью ICQ
По умолчанию

Спасибо, буду пробовать.
Zergalius вне форума   Ответить с цитированием
Старый 11.07.2009, 20:41   #5
Специалист
 
Аватар для apple
 
Регистрация: 15.07.2007
Адрес: Беларусь, но скоро будет РФ :)
Сообщений: 232
Вес репутации: 214
apple - как роза среди колючекapple - как роза среди колючекapple - как роза среди колючекapple - как роза среди колючек
По умолчанию

Цитата:
LIKE '%$catalog%'
Я так понимаю это не поиск, а простая выборка в зависимости от каталога.
Тогда заменить на
Цитата:
= '$catalog'
i1 сделать индексированным.

Добавлено через 2 минуты
Если именно LIKE, то только связанную таблицу со всевозможными вариантами написания $catalog. Тогда можно будет вложенным запросом убрать LIKE.
__________________
Получи хостинг и .RU за минуту! Включи сейчас, плати потом! Полностью автоматизированный хостинг. Составьте сами Тарифный план!
Каб любить Беларусь нашу милую... требо в росных краях побывать...

Последний раз редактировалось apple; 11.07.2009 в 20:41. Причина: Добавлено сообщение
apple вне форума   Ответить с цитированием
Старый 11.07.2009, 21:48   #6
Специалист
 
Регистрация: 18.05.2009
Сообщений: 176
Вес репутации: 190
Zergalius - как роза среди колючекZergalius - как роза среди колючекZergalius - как роза среди колючекZergalius - как роза среди колючек
Отправить сообщение для Zergalius с помощью ICQ
По умолчанию

Правильно, выборка в зависимости от каталога.
Обдумываю как переделать базу и впредь на такое не натыкаться.

А rand() всё же даёт не даёт случайное число, а случайным образом строки с таблицы. Иначе как при таком запросе всё время выдаются разные записи? :-)
Zergalius вне форума   Ответить с цитированием
Старый 11.07.2009, 23:03   #7
Специалист
 
Аватар для apple
 
Регистрация: 15.07.2007
Адрес: Беларусь, но скоро будет РФ :)
Сообщений: 232
Вес репутации: 214
apple - как роза среди колючекapple - как роза среди колючекapple - как роза среди колючекapple - как роза среди колючек
По умолчанию

Ну раз простая выборка, то сделай индексированными поля, по которым она идет и замени LIKE на = как я написал.
__________________
Получи хостинг и .RU за минуту! Включи сейчас, плати потом! Полностью автоматизированный хостинг. Составьте сами Тарифный план!
Каб любить Беларусь нашу милую... требо в росных краях побывать...
apple вне форума   Ответить с цитированием
Старый 12.07.2009, 00:19   #8
Эксперт
 
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 251
boric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущееboric - прекрасное будущее
По умолчанию

Zergalius,
Цитата:
Правильно, выборка в зависимости от каталога.
Не надо в этой таблице вообще имена каталогов хранить. Для каталогов надо отдельную таблицу делать, а в этой таблице хранить лишь id каталогов.
boric вне форума   Ответить с цитированием
Старый 12.07.2009, 00:43   #9
Э̀҉к͜с͜͏п̧́е͟р̶т̧̕
 
Аватар для Veem
 
Регистрация: 11.04.2008
Адрес: Маськва
Сообщений: 1,996
Вес репутации: 320
Veem - прекрасное будущееVeem - прекрасное будущееVeem - прекрасное будущееVeem - прекрасное будущееVeem - прекрасное будущееVeem - прекрасное будущееVeem - прекрасное будущееVeem - прекрасное будущееVeem - прекрасное будущееVeem - прекрасное будущееVeem - прекрасное будущее
По умолчанию

Цитата:
Сообщение от apple Посмотреть сообщение
Ну раз простая выборка, то сделай индексированными поля, по которым она идет и замени LIKE на = как я написал.
Этого должно хватить.

Цитата:
Сообщение от boric Посмотреть сообщение
Не надо в этой таблице вообще имена каталогов хранить. Для каталогов надо отдельную таблицу делать, а в этой таблице хранить лишь id каталогов.
Это зависит от соотношения жесткости ограничений по загрузке и объему. Так, например, я на своем проекте вынужден хранить данные в минимальном объеме, жертвуя быстродействием, т.к. их быстро становится слишком дохрена и важна экономия каждого байта в кортеже.
__________________
Все мои сайты живут на этом хостинге с 2006 года. Ого, уже больше 10 лет.
Veem вне форума   Ответить с цитированием
Старый 12.07.2009, 00:47   #10
Специалист
 
Аватар для Challenger
 
Регистрация: 29.08.2008
Адрес: РОССИЯ. Севастополь.
Сообщений: 430
Вес репутации: 207
Challenger - просто великолепная личностьChallenger - просто великолепная личностьChallenger - просто великолепная личностьChallenger - просто великолепная личностьChallenger - просто великолепная личностьChallenger - просто великолепная личность
Отправить сообщение для Challenger с помощью ICQ
По умолчанию

да вытаскивайте все что подходит условию, а рендомность в пхп уже делайте из массива данных.
__________________
Люблю все на "Ш". Шампанское, маШины, женШин...
Challenger вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ВЧ запрос BossIT Общие вопросы оптимизации 4 02.06.2009 17:21
Помогите составить SQL запрос? Fredy314 Разработка и сопровождение сайтов 7 02.06.2009 09:19
Запрос к MySQL Ulf Разработка и сопровождение сайтов 13 12.05.2009 00:26
Запрос выпал из Яндекса Kubert Общие вопросы оптимизации 3 14.10.2008 13:04
Левый запрос на выплату Сергей Ошибки при работе с системой 7 23.11.2007 19:10


Часовой пояс GMT +3, время: 09:37.