Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подскажите с ускорением таблицы связей / 10 сообщений из 10, страница 1 из 1
12.04.2017, 06:29
    #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
12.04.2017, 07:47
    #39436966
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с ускорением таблицы связей
Формально базовая таблица - это подзапрос, соответственно и индексации у него нет. Возможно, немного поможет изменение порядка таблиц во внешнем FROM на `k-ts`-`k-t_s`-`g` плюс STRAIGHT_JOIN, хотя оптимизатор и так должен это сделать... и не вижу смысла в группировке по `k-t_s`.`id_s` во внешнем запросе.
...
Рейтинг: 0 / 0
12.04.2017, 16:36
    #39437429
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с ускорением таблицы связей
Спасибо, буду думать над вашими советами.
...
Рейтинг: 0 / 0
13.04.2017, 21:23
    #39438282
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с ускорением таблицы связей
[quot andrejk] более). Посмотрите, пожалуйста, грамотно ли расставлены индексы и можно ли ещё как-то ускорить длиннющую таблицу связей `k-t_s`?

нет, не грамотно.
Безграмотно.
...
Рейтинг: 0 / 0
13.04.2017, 21:25
    #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
18.04.2017, 00:00
    #39439896
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с ускорением таблицы связей
[quot MasterZiv]andrejk более). Посмотрите, пожалуйста, грамотно ли расставлены индексы и можно ли ещё как-то ускорить длиннющую таблицу связей `k-t_s`?

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

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

Можно немного подробнее, я не знаю о таких возможностях СКЮЭЛЬ, как разбивка на подзапросы. Просто логику БД расскажите, а детали я сам почитаю.
...
Рейтинг: 0 / 0
18.04.2017, 15:37
    #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
22.04.2017, 01:40
    #39442581
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите с ускорением таблицы связей
MasterZiv,

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


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