powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ускорение запроса
6 сообщений из 6, страница 1 из 1
Ускорение запроса
    #38759079
ditas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Столкнулся со следующей проблемой. Суть запроса в выборе компании по тегу/тегам. Таблица компаний имеет вид:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE IF NOT EXISTS `companies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `official_name` varchar(250) NOT NULL,
  `public_name` varchar(250) DEFAULT NULL,
...
  PRIMARY KEY (`id`),
  KEY `priority` (`priority`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1 ;


Таблица тегов:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE IF NOT EXISTS `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `num` varchar(11) NOT NULL DEFAULT '0',
  `val` varchar(200) NOT NULL,
  `fk_parent` int(11) NOT NULL DEFAULT '0',
...
  PRIMARY KEY (`id`),
  KEY `val` (`val`),
  KEY `num` (`num`),
  KEY `url` (`url`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1 ;


Связка многие-ко-многим:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE IF NOT EXISTS `tag2comp` (
  `fk_company` int(11) NOT NULL,
  `fk_tag` int(11) NOT NULL,
  `local_weight` int(11) NOT NULL DEFAULT '0',
  UNIQUE KEY `comp_tag` (`fk_company`,`fk_tag`),
  KEY `fk_tag` (`fk_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;


Сам запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
_companies.id as _companies_id,
_companies.old_id as _companies_old_id,
_companies.official_name as _companies_official_name,
_companies.public_name as _companies_public_name 
... 
from companies as _companies 
where 
(_companies.status = '2' and _companies.id in 
(select fk_company from tag2comp where fk_tag in (48636))) 
order by _companies.priority asc limit 0,10


Так вот, когда тег один этот запрос отрабатывает за ~0.3-0.5 сек.
Я заменяю вложенный запрос на inner join вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select distinct
_companies.id as _companies_id,
_companies.old_id as _companies_old_id,
_companies.official_name as _companies_official_name,
_companies.public_name as _companies_public_name 
... 
from companies as _companies 
inner join tag2comp as t2c on _companies.id=t2c.fk_company AND fk_tag IN (48636)
where (_companies.status = '2') order by _companies.priority asc limit 0,10


Этот запрос выполняется быстрее, примерно за 0.01 сек.
Однако, когда тегов много ситуация становится обратной. Запрос вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
_companies.id as _companies_id,
_companies.old_id as _companies_old_id,
_companies.official_name as _companies_official_name,
_companies.public_name as _companies_public_name 
... 
from companies as _companies 
where 
(_companies.status = '2' and _companies.id in 
(select fk_company from tag2comp where fk_tag in (8,47,559,564,565,566,569,570,571,6614,567,568,560,572,573,574,575,6692,6699,561,562,86,581,582,583,584,6749,6750,6751,563,585,586,6719,6722,6723,6724,6725,48,587,6579,6580,6581,588,589,6584,6585,6586,590,591,6693,592,6582,6583,6694,49,97,593,6611,6612,594,6609,6610,595,596,597,598,599,601,602,603,604,605,606,600,6587,6591,6592,6650,6665,6688,6720,6726))) 
order by _companies.priority asc limit 0,10


выполняется 0.2-0.5 сек.
Запрос же вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select distinct
_companies.id as _companies_id,
_companies.old_id as _companies_old_id,
_companies.official_name as _companies_official_name,
_companies.public_name as _companies_public_name 
... 
from companies as _companies 
inner join tag2comp as t2c on _companies.id=t2c.fk_company AND fk_tag IN (8,47,559,564,565,566,569,570,571,6614,567,568,560,572,573,574,575,6692,6699,561,562,86,581,582,583,584,6749,6750,6751,563,585,586,6719,6722,6723,6724,6725,48,587,6579,6580,6581,588,589,6584,6585,6586,590,591,6693,592,6582,6583,6694,49,97,593,6611,6612,594,6609,6610,595,596,597,598,599,601,602,603,604,605,606,600,6587,6591,6592,6650,6665,6688,6720,6726)
where (_companies.status = '2') order by _companies.priority asc limit 0,10


выполняется от 3 до 10 секунд.
Непонятно, какой из запросов использовать и можно ли их как-то оптимизировать универсально (т.е., как для одного, так и для многих тегов)?
Заранее спасибо.
...
Рейтинг: 0 / 0
Ускорение запроса
    #38759084
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно, что же тебе в итоге надо...

ditasНепонятно, какой из запросов использовать


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


ditasи можно ли их как-то оптимизировать универсально (т.е., как для одного, так и для многих тегов)?

Нельзя.
Универсально оптимизировать вообще нельзя ничего.
...
Рейтинг: 0 / 0
Ускорение запроса
    #38759089
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ditas,

А, если ты о замене IN на INNER JOIN -- то НЕ НАДО заменять.
...
Рейтинг: 0 / 0
Ускорение запроса
    #38759090
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создайте на каждой таблице составной индекс с требуемым для выбранного типа запроса набором полей. Текущие ключи для этих запросов - не очень-то...
...
Рейтинг: 0 / 0
Ускорение запроса
    #38759094
ditas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Время выполнения здесь критично. Поэтому я пытаюсь понять, почему же join для одного тега ускоряет запрос в 35-50 раз (до приемлемого значения), а в случае многих тегов замедляет его до совершенно неприемлемого значения. Моя задача ускорить выполнение запроса, т.к., даже "быстрый" вариант для многих тегов (0.2-0.5 сек.) не подходит, а схема с join'ами не работает.
...
Рейтинг: 0 / 0
Ускорение запроса
    #38759188
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ditasПоэтому я пытаюсь понять
RTFM EXPLAIN
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ускорение запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]