Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Можно ли ускорить запрос? (сейчас 4сек) (Mikluho) 22/09/2006 - 17:17:38
      Re: Можно ли ускорить запрос? (сейчас 4сек) (Ivan) 23/09/2006 - 14:25:40

> Original message text:
> From: Mikluho - 22/09/2006 - 17:17:38
> Subject:Можно ли ускорить запрос? (сейчас 4сек)
> -----------------
> select distinct m.manufacturers_name, p.products_model, m.manufacturers_id,
> p.products_id, pd.products_name, p.products_price, p.products_status,
> p2c.categories_id, pd.products_id, p2c.products_id
> from products p, manufacturers m,
> products_description pd,
> categories c, categories c2, categories c3,
> products_to_categories p2c
> WHERE m.manufacturers_id=p.manufacturers_id
> and p.products_id = pd.products_id
> and p.products_id = p2c.products_id
> and p2c.categories_id = c.categories_id
> AND p.products_status = 1
> and c.categories_status <> 0 AND
> (c.parent_id = 0 OR
> (c.parent_id = c2.categories_id AND c2.categories_status <> 0
> AND (c2.parent_id = 0 OR (c2.parent_id = c3.categories_id
> AND c3.categories_status <> 0 AND c3.parent_id = 0)))) and
> ((pd.products_name like '%44%' or
> LCASE(REPLACE(REPLACE(p.products_model, ' ', ''),'-','')) like '%44%'
> or m.manufacturers_name like '%44%') )
> ORDER BY p.products_price
> limit 0, 20
>
> explain:
> id select_type table type possible_keys key key_len ref rows Extra
> 1 SIMPLE p ALL PRIMARY,manufacturers_id NULL NULL NULL 4765 Using where; Using temporary; Using filesort
> 1 SIMPLE m eq_ref PRIMARY PRIMARY 4 u27461.p.manufacturers_id 1
> 1 SIMPLE pd ref PRIMARY PRIMARY 4 u27461.p.products_id 1 Using where
> 1 SIMPLE p2c ref PRIMARY PRIMARY 4 u27461.p.products_id 1 Using index
> 1 SIMPLE c2 ALL PRIMARY,idx_categories_parent_id NULL NULL NULL 118 Distinct
> 1 SIMPLE c3 ALL PRIMARY,idx_categories_parent_id NULL NULL NULL 118 Distinct
> 1 SIMPLE c eq_ref PRIMARY,idx_categories_parent_id PRIMARY 4 u27461.p2c.categories_id 1 Using where; Distinct
>
> Запрос выполняется почти 4 секунды - очень много! Как ускорить запрос?
>


From: Ivan - 23/09/2006 - 14:25:40
Subject:Можно ли ускорить запрос? (сейчас 4сек)
-----------------
Приведите список индексов, созданных для таблиц, участвующих в выборке (если не ошибаюсь, SHOW KEYS FROM ...).

Первое, что бросается в глаза - выборка по условию _поле_ LIKE '%...%'. При таком условии, сервер будет последовательно перебирать все записи в таблице не зависимо от того, создан индекс для _поле_ или нет. Учитывая сложность Вашего запроса, это значительно снизит время его выполнения. Индекс, может быть, будет использован в выборке только если правая часть сравнения составлена таким образом: LIKE '...%'.

Второй момент - LCASE(REPLACE(REPLACE(p.products_model, ' ', ''),'-','')). При таком условии, опять таки индекс поля products_model никогда не будет задействован, даже если правая часть сравнения LIKE '%...%' будет изменена на LIKE '...%'. Сервер будет прочесывать все записи таблицы, преобразовывать поле products_model при помощи указанных функций и сравнивать полученное значение с правой частью условия.


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
29740



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |