powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос. Как ускорить?
25 сообщений из 46, страница 1 из 2
Медленный запрос. Как ускорить?
    #38787659
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT `k-ts`.`s` slovo, count( * ) kol
FROM `k-t_s` 
JOIN `k-ts` ON `k-t_s`.`id_s` = `k-ts`.`ids` 
WHERE `k-ts`.`f` =0
GROUP BY `k-t_s`.`id_s` 
ORDER BY count( `k-t_s`.`id_s` ) DESC 
LIMIT 1


Вот план:
id select_type table type possible_keys key key_len ref rows Extra
-------------------------------------------------------------------------------------------------------------------------------------
1 SIMPLE k-ts ref PRIMARY,f f 1 const 35187 Using temporary; Using filesort
1 SIMPLE k-t_s ref id_s id_s 4 webart_200slov.k-ts.ids 112 Using index
Вот дамп:
Код: 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.
--
-- Структура таблицы `k-ts`
--

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

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

--
-- Структура таблицы `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`),
  KEY `id_s` (`id_s`),
  KEY `id_n` (`id_n`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Связи для кириллицы' AUTO_INCREMENT=5043234 ;


Подскажите, как сделать этот запрос быстрее. Сейчас по минуте выполняется.
В `k-ts` 70 000 записей.
В `k-t_s` 5 000 000 записей (связи).
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787663
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787664
mikhalken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Индексы используются правильные. Вопрос в том, как избавится от временной таблицы... Попробуй так:
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787665
mikhalken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT `k-t_s`.`id_s`, `k-ts`.`s` slovo, count( `k-t_s`.`ids` ) kol
FROM `k-t_s`
JOIN `k-ts` ON `k-t_s`.`id_s` = `k-ts`.`ids`
WHERE `k-ts`.`f` =0
GROUP BY 1
ORDER BY 3
LIMIT 1

Может прокатить, т.к. обрабатываются только поля из выборки. Но много зависит от версии мускула.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787673
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mikhalkenSELECT `k-t_s`.`id_s`, `k-ts`.`s` slovo, count( `k-t_s`.`ids` ) kol
FROM `k-t_s`
JOIN `k-ts` ON `k-t_s`.`id_s` = `k-ts`.`ids`
WHERE `k-ts`.`f` =0
GROUP BY 1
ORDER BY 3
LIMIT 1

Может прокатить, т.к. обрабатываются только поля из выборки. Но много зависит от версии мускула.
Вот эти строки мне не понятны —
Код: sql
1.
2.
GROUP BY 1 
ORDER BY 3
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787680
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk,

1. сильно ускорить можно денормализацией
каунта на родительскую таблицу --
или тригерами для реал-тайма или
регулярным пересчетом с допустимым
интервалом задержки

2. фаилсорт -- это индикация сорта -- не обязательно на диске.
Тут интересно посмотреть если диск задейсвован или все в памяти?
В течении минуты, вы реально слышите диск?
лампочка диска мигает? если на удаленке, то
посмотрите iostat, top, mytop.

Если будет наблюдатся дисковая активность -- попробуйте

3. увеличить РАМ и сорт-буффер (или как он там называется?)

4. убрать из запроса
SELECT `k-ts`.`s` slovo,
и заменить его на

Код: sql
1.
2.
3.
4.
5.
SELECT  `k-t_s`.`id_s`,  count(1) kol 
-- или `k-ts`.`ids`,  count(1) kol 
.....
GROUP BY 1
....



и подсоединить конкретное СЛОВО после выборки ЛИМИТ 1
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787710
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё происходит на хостинге, я не могу знать про загрузку диска. Но техподдержка говорила, что всё это время (минуту) в память копировалась какая-то таблица, из которой потом была выборка.
Странно ещё и то, что день-два потормозит, потом неделю всё нормально, запросы по 10 секунд, а потом опять по минуте и более. Вот этот феномен как получается? Может подскажете?
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787734
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT `k-ts`.`ids` slovo,  count(1) kol 
	FROM `k-t_s`
	join `k-ts` on `k-t_s`.`id_s` = `k-ts`.`ids`
	where `k-ts`.`f` = 0
	GROUP BY 1
	ORDER BY count(`k-t_s`.`id_s`) DESC
	LIMIT 1


Но как теперь присоединить слово после LIMIT 1 не знаю. Я не силён особо в SQL.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787740
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkСделал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT `k-ts`.`ids` slovo,  count(1) kol 
	FROM `k-t_s`
	join `k-ts` on `k-t_s`.`id_s` = `k-ts`.`ids`
	where `k-ts`.`f` = 0
	GROUP BY 1
	ORDER BY count(`k-t_s`.`id_s`) DESC
	LIMIT 1


Но как теперь присоединить слово после LIMIT 1 не знаю. Я не силён особо в SQL.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT 
  k-ts.slovo
FROM
(
  SELECT 
    TS.`ids` slovo_ID
  FROM 
    `k-t_s` T_S
  JOIN 
    `k-ts` TS1 ON T_S.`id_s` = TS1.`ids`
  WHERE 
    TS.`f` = 0
  GROUP BY 1
  ORDER BY count(1) DESC
  LIMIT 1
) z
JOIN  
  k-ts TS2 ON TS2.ids = z.slovo_ID



еще раз, зачем это делается: для разгрузки
промежуточной таблицы и попытка избежать
вываливание процесса на диск
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787741
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WHERE
TS.`f` = 0

должно быть

WHERE
TS1.`f` = 0
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787743
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и во второй строчке алиас поправил:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT 
  TS2.slovo
FROM
(
  SELECT 
    TS.`ids` slovo_ID
  FROM 
    `k-t_s` T_S
  JOIN 
    `k-ts` TS1 ON T_S.`id_s` = TS1.`ids`
  WHERE 
    TS1.`f` = 0
  GROUP BY 1
  ORDER BY count(1) DESC
  LIMIT 1
) z
JOIN  
  k-ts TS2 ON TS2.ids = z.slovo_ID
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787746
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkВсё происходит на хостинге, я не могу знать про загрузку диска. Но техподдержка говорила, что всё это время (минуту) в память копировалась какая-то таблица, из которой потом была выборка.
Странно ещё и то, что день-два потормозит, потом неделю всё нормально, запросы по 10 секунд, а потом опять по минуте и более. Вот этот феномен как получается? Может подскажете?


Это легко -- шаред хостинг иногда загружен
другими пользователями -- иногда нет.
Ваш сервер в целом иногда загружен, иногда нет --
например если там еше ваш веб сервер крутится.
Загрузка ЦПУ, РАМ, диск И/О с задержками.

Реально лечится или на логическом уровне
денормализацией, или на админовском уровне
подгонкой сервера -- что трудно на шаред сервере.
Или переходить на выделеный сервер.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787748
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посоветуете что-нибудь по денормализации? Основы на пальцах.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787776
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk,

на пальцах идея простая:

Вместо того чтоб считать каждый раз каунт
K-T_S для каждой записи TS -- иметь это значение
напрямую в TS.

Например есть родитель ПОКУПКА и детишки в ЛИНИЯ_ЧЕКА

сумму по чеку записать (денормализовать) в таблицу ПОКУПКА,
хотя это значение есть сумма из всех дочерних записей
в таблицы ЛИНИЯ_ЧЕКА.

Эта денормализация называется "наверх" (upstream denormalization)
ибо нормализованые значения в детишках
денормализуются "наверх" в родительские записи.

Теперь по реализации. Если надо абсолютно сразу
иметь иметь информацию, то можно сделать на
клиентском калбеке иили на тригерах самой базы:
про вставлении новой записи в K-T-S, немендлено
пересчитать каунт в TS.

Если трансакции не частые и пользователь разрешит выдавать
ему значение с задержкой, то можно пересчитывать новые поступления
раз час, или раз в день -- это вместо тригера.

В вашем случае денормализация полность ислючит необходимость
подсоединять и считать таблицу K-T-S и результат будет
в районе долей милисекунды.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787842
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk,

делай group by по полю s, а не по ids.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38787847
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

да и вообще, странный запрос....
можешь объяснить, что же он должен выдавать?

потом, сколько записей нужно в итоге просуммировать?

сколько записей во всех таблицах и сколько попадать под условие в where?
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788037
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос выдаёт слова и их число повторений в таблице связей в порядке убивания по числу повторений.
Короче, самые популярные слова выдаёт.
Слов 70 000, связей 5 000 000, я это уже писал вначале.
Из слов составлены наборы, которые определяются связями.
Наборов 320 000.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788052
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcandrejk,

на пальцах идея простая:

Вместо того чтоб считать каждый раз каунт
K-T_S для каждой записи TS -- иметь это значение
напрямую в TS.

Например есть родитель ПОКУПКА и детишки в ЛИНИЯ_ЧЕКА

сумму по чеку записать (денормализовать) в таблицу ПОКУПКА,
хотя это значение есть сумма из всех дочерних записей
в таблицы ЛИНИЯ_ЧЕКА.

Эта денормализация называется "наверх" (upstream denormalization)
ибо нормализованые значения в детишках
денормализуются "наверх" в родительские записи.

Теперь по реализации. Если надо абсолютно сразу
иметь иметь информацию, то можно сделать на
клиентском калбеке иили на тригерах самой базы:
про вставлении новой записи в K-T-S, немендлено
пересчитать каунт в TS.

Если трансакции не частые и пользователь разрешит выдавать
ему значение с задержкой, то можно пересчитывать новые поступления
раз час, или раз в день -- это вместо тригера.

В вашем случае денормализация полность ислючит необходимость
подсоединять и считать таблицу K-T-S и результат будет
в районе долей милисекунды.
Я тоже уже подумал про дополнительное поле с числом вхождений слов в таблице связей (в наборах). Думаю, что этот вариант лучше всего подойдёт. Этот запрос нужен только для перевода самых популярных слов, поэтому пересчёт можно делать даже раз в день, т.к. небольшое изменение ситуации не принципиально.
Блин, а можно как-то без ПХП всё посчитать и записать в дополнительный столбец? не выходя их мускля.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788071
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkа можно как-то без ПХП всё посчитать и записать в дополнительный столбец?Можно. Более того, нужно :)
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788089
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это даже получается, можно трригер написать?
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788094
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужна с этим помощь. Я понимаю, как выбрать что-то, если знаем что, но как циклично выбрать и посчитать, да ещё записать всё подряд не умею.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788108
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkМне нужна с этим помощь. Я понимаю, как выбрать что-то, если знаем что, но как циклично выбрать и посчитать, да ещё записать всё подряд не умею.

Сначала делаешь поле и делаешь его UPdate , посчитав соотв. кол-во слов (это будет долго, и до конца операции нельзя использовать БД пользователями). Потом пишешь триггер (пишешь -то конечно заранее, в этот момент только заливаешь), который по вставке нового слова увеличивает соотв. счётчик, по удалению -- уменьшает, по изменению -- и уменьшает новое, и увеличивает старое.
(это конечно будет три триггера). Заливаешь его -- и можно пускать пользователей.
Дальше оно всё само будет считаться.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788113
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Общую логику я соображу. Мне бы синтаксис, примерчик запросика, чтобы всё посчитать и занести в столбец, который я уже создал)
Единственное, как его URDATE сделать? Я думал, достаточно просто создать столбец.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788180
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот число посчитать могу, а как эти данные занести теперь в дополнительный столбец `k-ts`.`kol`, где `k-t_s`.`id_s` соответствует `k-ts`.`ids`?
Код: sql
1.
2.
3.
4.
SELECT `id_s` , count( * ) 
FROM `k-t_s` 
GROUP BY (`id_s` 
)
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788277
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пришлось и полез.
...
Мне самому хочется разобраться в пределах своего сайта. Я хочу знать свой сайт, т. е. сам его сделать. Так получилось, что вышло всё не так просто, как предполагалось. И почему я что-то должет в этом плане объяснять? Вы что, привыкли, что тут одни лодыри сидят, которые хотят, чтоб за них писали? Посмотрите мои темы, я часто выкладываю решение, даже если сам догадался, вдруг кому поможет. А вы, (тоже мужчина, наверное?), вместо того, чтобы умничать, лучше бы подсказали, про какие возможности sql почитать, если пример дать принципы не позволяют, а то знаете, как-то непонятно, что искать, когда не знаешь, что искать. Я учусь только на своём сайте и только по мере необходимости.
Ну так, подскажете, про что почитать? Мне нужно одним запросом посчитать и записать в новый столбец результат.
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос. Как ускорить?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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