powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подскажите с ускорением таблицы связей
10 сообщений из 10, страница 1 из 1
Подскажите с ускорением таблицы связей
    #39436945
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть таблица связей с более чем 6 000 000 строк. Она участвует в не самом простом запросе и начала уже ощутимо тормозить (до 10 секунд и более). Посмотрите, пожалуйста, грамотно ли расставлены индексы и можно ли ещё как-то ускорить длиннющую таблицу связей `k-t_s`?

Структура таблиц.

Код: sql
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.
29.
30.
31.
32.
--
-- Структура таблицы `k-ts`
--

CREATE TABLE IF NOT EXISTS `k-ts` (
  `ids` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `s` varchar(60) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `kol` mediumint(8) unsigned NOT NULL COMMENT 'Количество',
  `f` tinyint(3) unsigned NOT NULL COMMENT 'Состояние',
  PRIMARY KEY (`ids`),
  UNIQUE KEY `s` (`s`),
  KEY `f` (`f`),
  KEY `kol` (`kol`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Слова на кириллице' AUTO_INCREMENT=9356184 ;

-- --------------------------------------------------------

--
-- Структура таблицы `k-t_s`
--

CREATE TABLE IF NOT EXISTS `k-t_s` (
  `id_sv` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `id_n` int(10) unsigned zerofill NOT NULL,
  `id_s` int(10) unsigned zerofill NOT NULL,
  PRIMARY KEY (`id_sv`),
  UNIQUE KEY `sost` (`id_n`,`id_s`),
  KEY `id_s` (`id_s`),
  KEY `id_n` (`id_n`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Связи для кириллицы' AUTO_INCREMENT=9159504 ;

-- --------------------------------------------------------



Запрос.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select `k-ts`.`s`, count(*)
	  from (
		select `k-t_s`.`id_n`
		from  `k-ts`
		join `k-t_s` on `k-t_s`.`id_s` = `k-ts`.`ids`
		where `k-ts`.`s` in ("фон","белый","город")
		group by `k-t_s`.`id_n` having count(/*distinct*/ `k-t_s`.`id_s`) = 3
		) `g`
	  join `k-t_s` on `k-t_s`.`id_n` = `g`.`id_n`
	  join `k-ts` on `k-ts`.`ids` = `k-t_s`.`id_s`
	  where `k-ts`.`f` in (0, 1, 7)
	  group by `k-t_s`.`id_s`, `k-ts`.`s`
	  order by count(*) desc, `k-ts`.`s` LIMIT 0, 160
	  ;
...
Рейтинг: 0 / 0
Подскажите с ускорением таблицы связей
    #39436966
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формально базовая таблица - это подзапрос, соответственно и индексации у него нет. Возможно, немного поможет изменение порядка таблиц во внешнем FROM на `k-ts`-`k-t_s`-`g` плюс STRAIGHT_JOIN, хотя оптимизатор и так должен это сделать... и не вижу смысла в группировке по `k-t_s`.`id_s` во внешнем запросе.
...
Рейтинг: 0 / 0
Подскажите с ускорением таблицы связей
    #39437429
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, буду думать над вашими советами.
...
Рейтинг: 0 / 0
Подскажите с ускорением таблицы связей
    #39438282
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot andrejk] более). Посмотрите, пожалуйста, грамотно ли расставлены индексы и можно ли ещё как-то ускорить длиннющую таблицу связей `k-t_s`?

нет, не грамотно.
Безграмотно.
...
Рейтинг: 0 / 0
Подскажите с ускорением таблицы связей
    #39438284
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkЗдравствуйте.
Есть таблица связей с более чем 6 000 000 строк. Она участвует в не самом простом запросе и начала уже ощутимо тормозить (до 10 секунд и более). Посмотрите, пожалуйста, грамотно ли расставлены индексы и можно ли ещё как-то ускорить длиннющую таблицу связей `k-t_s`?

Структура таблиц.

Код: sql
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.
29.
30.
31.
32.
--
-- Структура таблицы `k-ts`
--

CREATE TABLE IF NOT EXISTS `k-ts` (
  `ids` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `s` varchar(60) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `kol` mediumint(8) unsigned NOT NULL COMMENT 'Количество',
  `f` tinyint(3) unsigned NOT NULL COMMENT 'Состояние',
  PRIMARY KEY (`ids`),
  UNIQUE KEY `s` (`s`),
  KEY `f` (`f`),
  KEY `kol` (`kol`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Слова на кириллице' AUTO_INCREMENT=9356184 ;

-- --------------------------------------------------------

--
-- Структура таблицы `k-t_s`
--

CREATE TABLE IF NOT EXISTS `k-t_s` (
  `id_sv` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `id_n` int(10) unsigned zerofill NOT NULL,
  `id_s` int(10) unsigned zerofill NOT NULL,
  PRIMARY KEY (`id_sv`),
  UNIQUE KEY `sost` (`id_n`,`id_s`),
  KEY `id_s` (`id_s`),
  KEY `id_n` (`id_n`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Связи для кириллицы' AUTO_INCREMENT=9159504 ;

-- --------------------------------------------------------



Запрос.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select `k-ts`.`s`, count(*)
	  from (
		select `k-t_s`.`id_n`
		from  `k-ts`
		join `k-t_s` on `k-t_s`.`id_s` = `k-ts`.`ids`
		where `k-ts`.`s` in ("фон","белый","город")
		group by `k-t_s`.`id_n` having count(/*distinct*/ `k-t_s`.`id_s`) = 3
		) `g`
	  join `k-t_s` on `k-t_s`.`id_n` = `g`.`id_n`
	  join `k-ts` on `k-ts`.`ids` = `k-t_s`.`id_s`
	  where `k-ts`.`f` in (0, 1, 7)
	  group by `k-t_s`.`id_s`, `k-ts`.`s`
	  order by count(*) desc, `k-ts`.`s` LIMIT 0, 160
	  ;




этот главный запрос на три подзапроса с exists расписать, уже лучше будет.
...
Рейтинг: 0 / 0
Подскажите с ускорением таблицы связей
    #39439896
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot MasterZiv]andrejk более). Посмотрите, пожалуйста, грамотно ли расставлены индексы и можно ли ещё как-то ускорить длиннющую таблицу связей `k-t_s`?

нет, не грамотно.
Безграмотно.

Не удивлён, это мои первые индексы). Что именно не так и почему? Как правильно, что почитать?
...
Рейтинг: 0 / 0
Подскажите с ускорением таблицы связей
    #39439897
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivэтот главный запрос на три подзапроса с exists расписать, уже лучше будет.

Можно немного подробнее, я не знаю о таких возможностях СКЮЭЛЬ, как разбивка на подзапросы. Просто логику БД расскажите, а детали я сам почитаю.
...
Рейтинг: 0 / 0
Подскажите с ускорением таблицы связей
    #39440260
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select `k-ts`.`s`, count(*)
from `k-t_s`
join `k-ts` on `k-ts`.`ids` = `k-t_s`.`id_s` and `k-ts`.`f` in (0, 1, 7)
where exists ( select * from  `k-ts` where `k-ts`.`ids` = `k-t_s`.`id_s` and `k-ts`.`s` = "фон")
  and exists ( select * from  `k-ts` where `k-ts`.`ids` = `k-t_s`.`id_s` and `k-ts`.`s` = "белый")
  and exists ( select * from  `k-ts` where `k-ts`.`ids` = `k-t_s`.`id_s` and `k-ts`.`s` = "город")
group by `k-ts`.`s`
order by count(*) desc
LIMIT 0, 160;
...
Рейтинг: 0 / 0
Подскажите с ускорением таблицы связей
    #39442581
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Но мы не знаем точное количество слов, которые будут. Как тогда?
...
Рейтинг: 0 / 0
Подскажите с ускорением таблицы связей
    #39442582
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И индексы занимают больше места чем данные раза в 4. Подскажите, может я лишних наставил или не рационально.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подскажите с ускорением таблицы связей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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