- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
VK приобрела 70% в структуре компании-разработчика red_mad_robot
Которая участвовала в создании RuStore
Оксана Мамчуева
Как удалить плохие SEO-ссылки и очистить ссылочную массу сайта
Применяем отклонение ссылок
Сервис Rookee
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Настройки менял, не помогло.
Вопрос как всегда на порассуждать.
Имеем:
Таблицу с 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. на локалке тестирую, всё летает, как ни странно.
Загоняю на движок и,.
Если сервер и БД совпадают (видимо)..
Проверить, какой драйвер используется в том и другом случае?
Что, если сделать тестовый вариант без "движка" (один файл, в нём подключение и запрос)?
была похожая ситуация, только наоборот. локально запрос зависал в статусе sending data бесконечно (ну или я не дожидался, порядок ожидания - десятки минут, уже тупо из любопытства). на сервере работал менее секунды (но всё равно довольно долго - запрос был тяжёлым). набор данных один и тот же. пробовал локально ставить такую же версию MySQL, пробовал несколько более новых и более старых версий - результат без изменений.
так как необходимость поднять проект локально была неизбежной, пришлось переписывать запрос так, чтобы он отрабатывал за приемлемое время. сдаётся мне, что имеет место какой-то системный баг в MySQL, который не могут выловить на протяжении уже многих версий.
Вопрос как всегда на порассуждать.
Тут не надо рассуждать - надо разбивать сложную систему на простые части и замерять каждое по отдельности. Чтобы разбить обработку запроса на просты части уже внутри mysql, нужно профилировать через set profiling=1;
Сервер mysql по сети к сайту подключен? размер результатов в байтах большой?
Настроил сервер, помогло, теперь хоть летает.
Конечно не могу понять иногда тормоза. Один из вариантов получается, всё упирается в диск и когда много запросов идёт, он просто ожидает.
---------- Добавлено 04.09.2012 в 23:38 ----------
Всё на 1 серваке.
Да максимум 30 000 записей id, это 30 000 * 3 (знаков в id в среднем) = 90 000 байт
---------- Добавлено 04.09.2012 в 23:39 ----------
Да куда проще то?
---------- Добавлено 04.09.2012 в 23:39 ----------
Кстати таблица 1 ГБ весит :)
---------- Добавлено 05.09.2012 в 01:00 ----------
Короче решил. А решил файловым кэшем. Взял да записал все эти id в файлы по категориям. И теперь мускулю не надо париться, перерывать каждый раз гигабайтную БД (которая растёт очень быстро), а берёт нужные id из файла.
Супер быстрая разбивка и хождение по страницам каталога.
Во как! :)
SELECT SQL_NO_CACHE id FROM `cms` WHERE cat=1
А чисто ради любопытства, можете сюда выложить результат "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
Да не вопрос.
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), чтобы данные прямо из индекса вытаскивать.
Если выборка из примера выше для вас достаточно значима, я бы ещё добавил составной индекс cat_id(cat,id), чтобы данные прямо из индекса вытаскивать.
Да там проблема в другом. Как зайдут наши любимые поисковые боты на разделы + 5000 обычных юзеров... и понеслось гонять эту гиговую таблицу туда сюда. Каждый хочет её SELECT 2-а раза, а она блокируется каждый раз.
Поэтому и решил кэш именно файловый сделать с id, ну и + количество id в text не помещается, а это значит держать такие массивы смысла нет в БД.
Да там проблема в другом. Как зайдут наши любимые поисковые боты на разделы + 5000 обычных юзеров... и понеслось гонять эту гиговую таблицу туда сюда. Каждый хочет её SELECT 2-а раза, а она блокируется каждый раз.
Поэтому и решил кэш именно файловый сделать с id, ну и + количество id в text не помещается, а это значит держать такие массивы смысла нет в БД.
ну в любом случае указанный мной индекс там не повредит :)
Составной индекс, действительно, почему не подумал раньше :(
Сейчас пока вставляется, потом тестану.