powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос. Как ускорить?
46 сообщений из 46, показаны все 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
Медленный запрос. Как ускорить?
    #38788291
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МультиТабл апдейт... простейший случай в примере внизу по ссылке.
в двухсловах: формируем SELECT заменяем на UPDATE
добавляем SET FIELD1='НОВОЕ ЗНАЧЕНИЕ'

пример
Код: sql
1.
2.
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;

...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788530
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Флуд и оффтоп зачищен.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788558
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то я косячу…
Код: sql
1.
2.
3.
4.
5.
6.
7.
update `k-ts`, `k-t_s` set `k-ts`.`kol` =
(
SELECT count(*)
FROM `k-t_s`
group by `k-t_s`.`id_s`
)
where `k-t_s`.`id_s` = `k-ts`.`ids`


Пишет: #1242 - Subquery returns more than 1 row

Отдельно
Код: sql
1.
2.
3.
SELECT count(*)
FROM `k-t_s`
group by `k-t_s`.`id_s`


выполняется, а в целом запросе нет.
что не так?
Вот таблицы:

CREATE TABLE IF NOT EXISTS `k-ts` (
`ids` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
`s` varchar(60) 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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Слова на кириллице' AUTO_INCREMENT=5072371 ;

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=5066222 ;
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788572
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkОтдельно
Код: sql
1.
2.
3.
SELECT count(*)
FROM `k-t_s`
group by `k-t_s`.`id_s`



выполняется, а в целом запросе нет.
что не так? английским по белому написано -
andrejkSubquery returns more than 1 row
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788597
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так:
Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts`, `k-t_s` set `k-ts`.`kol` =
(
SELECT count(`k-t_s`.`id_s`)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`
)


PHPmyAdmin уже минут 10-15 думает…
Это нормально?
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788602
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то типа:

Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts`
set `k-ts`.`kol` =
(
SELECT count(*)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`)
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788603
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkСделал так:
Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts`, `k-t_s` set `k-ts`.`kol` =
(
SELECT count(`k-t_s`.`id_s`)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`
)


PHPmyAdmin уже минут 10-15 думает…
Это нормально?

нет, не нормально, у вас ошибка в СКЛ,
посмотрите мой вариант.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788611
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcчто-то типа:

Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts`
set `k-ts`.`kol` =
(
SELECT count(*)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`)


Попробовал ваш запрос, вот что выдало через несколько минут:
Lock wait timeout exceeded; try restarting transaction
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788636
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkjavajdbcчто-то типа:

Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts`
set `k-ts`.`kol` =
(
SELECT count(*)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`)


Попробовал ваш запрос, вот что выдало через несколько минут:
Lock wait timeout exceeded; try restarting transaction


ок, тогда сделайте уж совсем прямолинейно:

(кстату, у вас есть индекс на таблице k-t_s на поле `id_s` ?
если не ОБЯЗАТЕЛЬНО сделайте)

сначала:

create table temp_01
select
id_s, count(1) kol
from k-t_s;

потом

CREATE INDEX idx_temp_01_ids ON temp_01 (id_s);

потом,

update `k-ts` ts
set ts.`kol` =
(select t1.kol from temp_01 t1 where t1.id_s = ts.id_s)
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788639
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, ну вечно я тороплюсь, вот так надо

create table temp_01
select
id_s, count(1) kol
from k-t_s
GROUP BY id_s;
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788648
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcок, тогда сделайте уж совсем прямолинейно:

(кстату, у вас есть индекс на таблице k-t_s на поле `id_s` ?
если не ОБЯЗАТЕЛЬНО сделайте)

Я так понял, первичный ключ, которым это поле является не в счёт. Сделать ещё индекс
Код: sql
1.
CREATE INDEX id_s ON k-t_s(id_s);


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

(кстату, у вас есть индекс на таблице k-t_s на поле `id_s` ?
если не ОБЯЗАТЕЛЬНО сделайте)

Я так понял, первичный ключ, которым это поле является не в счёт. Сделать ещё индекс
Код: sql
1.
CREATE INDEX id_s ON k-t_s(id_s);


?

если ид_с НЕ первый в наборном ключе, то надо сделать
отдельный индекс.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788652
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc
если ид_с НЕ первый в наборном ключе, то надо сделать
отдельный индекс.
упс, я подвис в терминологии…
Что значит «НЕ первый в наборном ключе» и «отдельный индекс»?
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788695
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkjavajdbcесли ид_с НЕ первый в наборном ключе, то надо сделать
отдельный индекс.
упс, я подвис в терминологии…
Что значит «НЕ первый в наборном ключе» и «отдельный индекс»?


если надо связку по полю А, то наборный индекс (А, Б)
вполне подойдет, а наборный индекс (Б,А)
не поможет -- А не на первом месте.
И надо создать отдельный индекс по (А).

Вообше все такие вопросы надо смотреть через ЕКСПЛЕЙН,
там будет видно какие индексы есть и какие
сработали , или не сработали.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788730
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Это вы, наверное, про СОСТАВНОЙ индекс имели ввиду? А то я термин «наборный» впервые слышу)
Ну а по затыку, который с вашим вариантом запроса вышел:

Lock wait timeout exceeded; try restarting transaction

это на стороне хостера ограничения какие-то?
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38788739
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkСпасибо. Это вы, наверное, про СОСТАВНОЙ индекс имели ввиду? А то я термин «наборный» впервые слышу)
Ну а по затыку, который с вашим вариантом запроса вышел:

Lock wait timeout exceeded; try restarting transaction

это на стороне хостера ограничения какие-то?


да, составной == наборный.


Я так думаю что апдейт хотел залочить таблицу
а ему кто-то дал это сдеалть.... можно просто повторить
снова и снова. Индекс на к-т-с ид-с надо полюбому.


То что я предложил с временой таблицей -- вопшемто
тоже самое, просто разбито на отдельны шаги --
при этом локов может быть меньше и больше
шансов на успех при громадных данных.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38789268
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С ума сойти. Попробовал ещё раз вот это:
Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts`
set `k-ts`.`kol` =
(
SELECT count(*)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`)


Всё за доли секунды прошло.
вчера звонил хостеру, выяснилось, что у меня там 6 часов какой-то запрос висел. Наверное он и не давал обновить таблицу.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38789895
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkС ума сойти. Попробовал ещё раз вот это:
Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts`
set `k-ts`.`kol` =
(
SELECT count(*)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`)


Всё за доли секунды прошло.
вчера звонил хостеру, выяснилось, что у меня там 6 часов какой-то запрос висел. Наверное он и не давал обновить таблицу.

ок, хорошо.

На всякий такой будуший случай посмотрите команду:

SHOW PROCESSLIST:

и

KILL <process_id>;

Этими командами вы сами сможете выловить
зависшие квери и убить по номеру процесса (если то надо).
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38790024
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо.
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38790204
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkСделал так:
Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts`, `k-t_s` set `k-ts`.`kol` =
(
SELECT count(`k-t_s`.`id_s`)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`
)


PHPmyAdmin уже минут 10-15 думает…
Это нормально?

\да
...
Рейтинг: 0 / 0
Медленный запрос. Как ускорить?
    #38790213
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivandrejkСделал так:
Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts`, `k-t_s` set `k-ts`.`kol` =
(
SELECT count(`k-t_s`.`id_s`)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`
)


PHPmyAdmin уже минут 10-15 думает…
Это нормально?

\да


Сори, должно быть
Код: sql
1.
2.
3.
4.
5.
6.
update `k-ts` set `k-ts`.`kol` =
(
SELECT count(`k-t_s`.`id_s`)
FROM `k-t_s`
where `k-t_s`.`id_s` = `k-ts`.`ids`
)
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос. Как ускорить?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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