Сильное зависание MYSQL - "Copying to tmp table"

12
Y5
На сайте с 14.07.2009
Offline
119
9502

Добрый день!

Установлен MYsql версия 5.5.54-0

База порядка 400 мб, есть одна таблица, с кол-вом данных от 1 млн. записей.

После завершения обновления данных в базе, процессор работает на всю.

И далее в процессах зависают много процессов:

Copying to tmp table SELECT DISTINCT wp_posts.ID FROM wp_term_taxonomy, wp_posts, wp_term_relationships WHERE

(Если брать новую базу с меньшим объемом данных, то все нормально.)

При этом ждал и час, два, толку нету.

Потом перезагрузка, и опять тоже самое, т.е. даже перезагрузка не помогает.

Установил tmp_table_size и max_heap_table_size по нулям. Всё вроде нормально стало.

При этом mysqltuner почемуто просил их хорошо увеличить...

Вопрос, установка по нулям значений - это нормально?

Сервер современный с 2 ядрами и SSD

Спасибо

Подписи пока нет :(
vandamme
На сайте с 30.11.2008
Offline
675
#1

yura5, sql запрос неполный написали, что после where? есть ли группировка? в мануалах и пишут что параметр tmp_table_size отвечает за ускорение обработки группирующих запросов (если я правильно понял), из-за того что вы обнулили, вероятно, вы дали разрешение использовать максимально возможное значение, поэтому все и виснет.

теоретически mysqltuner фигни не посоветует.

S
На сайте с 17.08.2008
Offline
114
#2
Copying to tmp table SELECT DISTINCT wp_posts.ID FROM wp_term_taxonomy, wp_posts, wp_term_relationships WHERE

Надо кешировать результат этого запроса, скажем на несколько часов...

AGHost
На сайте с 16.11.2011
Offline
115
#3

yura5, укажите еще так - tmpdir = /dev/shm, что бы временные таблицы создавались в памяти.

8 лет на рынке услуг хостинга - https://agho.st (https://agho.st)
L
На сайте с 10.02.2015
Offline
246
#4

1. Запрос не полный

2. SHOW PROCESSLIST в Mysql вряд ли адекватный :)

3. Вы отключили временные таблицы в памяти, они будут создаваться сразу на диске.

4. EXPLAIN в студию

FROM wp_term_taxonomy, wp_posts, wp_term_relationships

Так запросы не пишут!

Тут может быть полное объединение таблиц :)

Нужно использовать JOIN:

FROM 

wp_posts P
JOIN
wp_term_relationships R ON (R.some_field = P.some_field)
JOIN
wp_term_taxonomy T ON (T.some_field = R.some_field)

Если помогло, то ок. :)

У самого часто висят запросы с такой информацией в SHOW PROCESSLIST.

Дивно, что отключение временные таблиц в памяти решило проблему. :)

Y5
На сайте с 14.07.2009
Offline
119
#5

Полный запрос:

SELECT DISTINCT wp_posts.ID FROM wp_term_taxonomy, wp_posts, wp_term_relationships WHERE wp_posts.ID = wp_term_relationships.object_id AND wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.term_id = 685 AND wp_posts.post_status = 'publish' AND wp_posts.post_type = 'post' AND wp_posts.post_date < NOW()



---------- Добавлено 08.02.2017 в 14:18 ----------

vandamme:
yura5, из-за того что вы обнулили, вероятно, вы дали разрешение использовать максимально возможное значение, поэтому все и виснет.
.

Так наоборот, вещало mysql раньше, когда значения была больше нуля.

Сейчас поставил 0 вроде нормально

Не понятно почему...

---------- Добавлено 08.02.2017 в 14:19 ----------

smbbws:
Надо кешировать результат этого запроса, скажем на несколько часов...

А что это даст, если таких запросов сотни... или тысячи

---------- Добавлено 08.02.2017 в 14:20 ----------

AGHost:
yura5, укажите еще так - tmpdir = /dev/shm, что бы временные таблицы создавались в памяти.

Нужно заменить строку:

tmpdir = /tmp

???

---------- Добавлено 08.02.2017 в 14:22 ----------

livetv:

1. Запрос не полный
2. SHOW PROCESSLIST в Mysql вряд ли адекватный :)
3. Вы отключили временные таблицы в памяти, они будут создаваться сразу на диске.
4. EXPLAIN в студию


Так запросы не пишут!
Тут может быть полное объединение таблиц :)
Нужно использовать JOIN:
FROM 

wp_posts P
JOIN
wp_term_relationships R ON (R.some_field = P.some_field)
JOIN
wp_term_taxonomy T ON (T.some_field = R.some_field)


Если помогло, то ок. :)
У самого часто висят запросы с такой информацией в SHOW PROCESSLIST.
Дивно, что отключение временные таблиц в памяти решило проблему. :)

Спасибо

Запрос полный выше, посмотрите пожалуйста.

Проблема в том, программист который делал это все, ушел.

Можно ли решить проблему увелечением join_buffer_size? Или еще как-то

AGHost
На сайте с 16.11.2011
Offline
115
#6
yura5:
Нужно заменить строку:

Да, и следует убедиться, что памяти есть свободных tmp_table_size МБ

[umka]
На сайте с 25.05.2008
Offline
456
#7
yura5:
Можно ли решить проблему увелечением join_buffer_size? Или еще как-то

Подобные проблемы лучше решать оптимизацией запросов или структуры БД, чем добавлением ресурсов.

Лог в помощь!
L
На сайте с 10.02.2015
Offline
246
#8

Это самописный запрос или CMS его сама генерирует?


SELECT
DISTINCT P.ID
FROM
wp_posts P
JOIN
wp_term_relationships R ON (R.object_id = P.ID)
JOIN
wp_term_taxonomy T ON (T.term_taxonomy_id = R.term_taxonomy_id AND T.term_id = 685)
WHERE
1
AND P.post_status = 'publish'
AND P.post_type = 'post'
AND P.post_date < NOW()

Какой EXPLAIN у Вашего и моего запроса?

Y5
На сайте с 14.07.2009
Offline
119
#9

Мой

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE wp_term_taxonomy ref PRIMARY,term_id_taxonomy term_id_taxonomy 8 const 1 Using temporary

1 SIMPLE wp_term_relationships ref PRIMARY,term_taxonomy_id term_taxonomy_id 8 site-bd.wp_term_taxonomy.term_taxonomy_id 90

1 SIMPLE wp_posts eq_ref PRIMARY,type_status_date PRIMARY 8 site-bd.wp_term_relationships.object_id 1 Using where

Ваш запрос:

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE T ref PRIMARY,term_id_taxonomy term_id_taxonomy 8 const 1 Using temporary

1 SIMPLE R ref PRIMARY,term_taxonomy_id term_taxonomy_id 8 site-bd.T.term_taxonomy_id 90

1 SIMPLE P eq_ref PRIMARY,type_status_date PRIMARY 8 site-bd.R.object_id 1 Using where

---------- Добавлено 10.02.2017 в 18:44 ----------

Запрос самописный, отдельный скрипт заливает данные в БД

L
На сайте с 10.02.2015
Offline
246
#10

EXPLAIN-ы как бы одинаковые.

Только я хз, почему

в первой таблице "const 1 Using temporary"

То есть выбирается по индексу 1 строка, но используются временные таблицы :)

Можно запрос переписать так:


SELECT
P.ID
FROM
wp_posts P
JOIN
wp_term_relationships R ON (R.object_id = P.ID)
JOIN
wp_term_taxonomy T ON (T.term_taxonomy_id = R.term_taxonomy_id AND T.term_id = 685)
WHERE
1
AND P.post_status = 'publish'
AND P.post_type = 'post'
AND P.post_date < NOW()
GROUP BY
P.ID
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий