Долго Mysql sending data

12
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
10566

Настройки менял, не помогло.

Вопрос как всегда на порассуждать.

Имеем:

Таблицу с 185 000 записями. Есть и id (int),varchar(255),TEXT и ещё по мелочи

Делаем запросы через phpmyadmin:

1.

SELECT SQL_NO_CACHE id FROM `cms` WHERE cat=1

Отображает строки 0 - 29 ( 34,027 всего, запрос занял 0.0274 сек.)

2.

SELECT SQL_NO_CACHE * FROM `cms` WHERE id in (1,2,3,4,5);

Выполняет запрос 0,007 секунд

Отображает строки 0 - 2 ( 3 всего, запрос занял 0.0095 сек.)

Короче всё лает. Загоняю на движок и, что я вижу, в MySQL Process List через WHM

Первый запрос:

sending data 15

т.е. выполняется 15 секунд.

Потом срабатывает кэш, и sending data падает до 2 секунд.

Но почему он обрабатывается 15 секунд, а через phpmyadmin за доли секунды?

p.s. на локалке тестирую, всё летает, как ни странно.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
IL
На сайте с 20.04.2007
Offline
435
#1
LEOnidUKG:
Загоняю на движок и,.

Если сервер и БД совпадают (видимо)..

Проверить, какой драйвер используется в том и другом случае?

Что, если сделать тестовый вариант без "движка" (один файл, в нём подключение и запрос)?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
Robin_Bad
На сайте с 24.12.2007
Offline
85
#2

была похожая ситуация, только наоборот. локально запрос зависал в статусе sending data бесконечно (ну или я не дожидался, порядок ожидания - десятки минут, уже тупо из любопытства). на сервере работал менее секунды (но всё равно довольно долго - запрос был тяжёлым). набор данных один и тот же. пробовал локально ставить такую же версию MySQL, пробовал несколько более новых и более старых версий - результат без изменений.

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

N
На сайте с 06.05.2007
Offline
419
#3
LEOnidUKG:
Вопрос как всегда на порассуждать.

Тут не надо рассуждать - надо разбивать сложную систему на простые части и замерять каждое по отдельности. Чтобы разбить обработку запроса на просты части уже внутри mysql, нужно профилировать через set profiling=1;

Сервер mysql по сети к сайту подключен? размер результатов в байтах большой?

Кнопка вызова админа ()
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#4

Настроил сервер, помогло, теперь хоть летает.

Конечно не могу понять иногда тормоза. Один из вариантов получается, всё упирается в диск и когда много запросов идёт, он просто ожидает.

---------- Добавлено 04.09.2012 в 23:38 ----------

Сервер mysql по сети к сайту подключен? размер результатов в байтах большой?

Всё на 1 серваке.

Да максимум 30 000 записей id, это 30 000 * 3 (знаков в id в среднем) = 90 000 байт

---------- Добавлено 04.09.2012 в 23:39 ----------

надо разбивать сложную систему на простые части

Да куда проще то?

SELECT SQL_NO_CACHE id FROM `cms` WHERE cat=1



---------- Добавлено 04.09.2012 в 23:39 ----------

Кстати таблица 1 ГБ весит :)

---------- Добавлено 05.09.2012 в 01:00 ----------

Короче решил. А решил файловым кэшем. Взял да записал все эти id в файлы по категориям. И теперь мускулю не надо париться, перерывать каждый раз гигабайтную БД (которая растёт очень быстро), а берёт нужные id из файла.

Супер быстрая разбивка и хождение по страницам каталога.

Во как! :)

Robin_Bad
На сайте с 24.12.2007
Offline
85
#5
LEOnidUKG:
SELECT SQL_NO_CACHE id FROM `cms` WHERE cat=1

А чисто ради любопытства, можете сюда выложить результат "SHOW CREATE TABLE `cms`"?

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#6
А чисто ради любопытства, можете сюда выложить результат "SHOW CREATE TABLE `cms`"?

Да не вопрос.

CREATE TABLE `cms` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,

`dec` text COLLATE utf8_unicode_ci NOT NULL,

`trans` varchar(255) COLLATE utf8_unicode_ci NOT NULL,

`data` date NOT NULL,

`pic` varchar(255) COLLATE utf8_unicode_ci NOT NULL,

`comment` int(1) NOT NULL DEFAULT '0',

`comment_static` int(1) NOT NULL,

`rating_static` int(1) NOT NULL,

`rating` int(1) NOT NULL DEFAULT '0',

`art` int(1) NOT NULL DEFAULT '0',

`nextart` int(1) NOT NULL DEFAULT '0',

`krohi` int(1) NOT NULL DEFAULT '0',

`description` text COLLATE utf8_unicode_ci NOT NULL,

`keywords` text COLLATE utf8_unicode_ci NOT NULL,

`cat` int(11) NOT NULL,

`search` text COLLATE utf8_unicode_ci NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `trans_2` (`trans`),

KEY `data` (`data`),

KEY `cat` (`cat`)

) ENGINE=MyISAM AUTO_INCREMENT=185776 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Robin_Bad
На сайте с 24.12.2007
Offline
85
#7
LEOnidUKG:
Да не вопрос.

CREATE TABLE `cms` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`dec` text COLLATE utf8_unicode_ci NOT NULL,
`trans` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`data` date NOT NULL,
`pic` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`comment` int(1) NOT NULL DEFAULT '0',
`comment_static` int(1) NOT NULL,
`rating_static` int(1) NOT NULL,
`rating` int(1) NOT NULL DEFAULT '0',
`art` int(1) NOT NULL DEFAULT '0',
`nextart` int(1) NOT NULL DEFAULT '0',
`krohi` int(1) NOT NULL DEFAULT '0',
`description` text COLLATE utf8_unicode_ci NOT NULL,
`keywords` text COLLATE utf8_unicode_ci NOT NULL,
`cat` int(11) NOT NULL,
`search` text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `trans_2` (`trans`),
KEY `data` (`data`),
KEY `cat` (`cat`)
) ENGINE=MyISAM AUTO_INCREMENT=185776 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Если выборка из примера выше для вас достаточно значима, я бы ещё добавил составной индекс cat_id(cat,id), чтобы данные прямо из индекса вытаскивать.

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#8
Robin_Bad:
Если выборка из примера выше для вас достаточно значима, я бы ещё добавил составной индекс cat_id(cat,id), чтобы данные прямо из индекса вытаскивать.

Да там проблема в другом. Как зайдут наши любимые поисковые боты на разделы + 5000 обычных юзеров... и понеслось гонять эту гиговую таблицу туда сюда. Каждый хочет её SELECT 2-а раза, а она блокируется каждый раз.

Поэтому и решил кэш именно файловый сделать с id, ну и + количество id в text не помещается, а это значит держать такие массивы смысла нет в БД.

Robin_Bad
На сайте с 24.12.2007
Offline
85
#9
LEOnidUKG:
Да там проблема в другом. Как зайдут наши любимые поисковые боты на разделы + 5000 обычных юзеров... и понеслось гонять эту гиговую таблицу туда сюда. Каждый хочет её SELECT 2-а раза, а она блокируется каждый раз.
Поэтому и решил кэш именно файловый сделать с id, ну и + количество id в text не помещается, а это значит держать такие массивы смысла нет в БД.

ну в любом случае указанный мной индекс там не повредит :)

mysql> explain SELECT SQL_NO_CACHE id FROM `cms` WHERE cat=1;

+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
| 1 | SIMPLE | cms | ref | cat | cat | 4 | const | 9 | |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------+
1 row in set (0.00 sec)

mysql> alter table cms add index cat_id(cat,id);
Query OK, 10 rows affected (0.11 sec)
Records: 10 Duplicates: 0 Warnings: 0

mysql> explain SELECT SQL_NO_CACHE id FROM `cms` WHERE cat=1;
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------------+
| 1 | SIMPLE | cms | ref | cat,cat_id | cat_id | 4 | const | 9 | Using index |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------------+
1 row in set (0.00 sec)
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#10

Составной индекс, действительно, почему не подумал раньше :(

Сейчас пока вставляется, потом тестану.

12

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