Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MySQL грузит процессор на все 100%, MySQL 5.0.67 
:(
    Опции темы
nIkTo
Дата 4.8.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Доброго времени суток. Подскажите как уменьшить нагрузку на процессор.
Раз в минуту скрипт делает выборку заданий :
Код

select * from tasks where status='wait' limit 5000

как только MySQL начинает обрабатывать этот запрос сервер застывает секунд на 5, такие провисания не приемлемы, в таблице около 30милионов записей.
Структура таблицы:
Код

create table tasks (
            id int not null auto_increment,
            query varchar(50) not null,
            language char(2) not null,
            status char(4) not null,
                        primary key (id),
                        unique key (query, language))
                        character set utf8 collate utf8_bin


Подскажите как оптимизировать мускул чтобы он имел так сказать планку и выше не прыгал. Может что-нибудь в конфигах MySQL сервера оптимизировать ?
Буду благодарен за любые идеи.

Pentium® 4 CPU 2.40GHz
MySQL 5.0.67
PM   Вверх
skyboy
Дата 4.8.2010, 15:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



что показывает explain? и, может, есть смысл проиндексировать поле status?
PM MAIL   Вверх
nIkTo
Дата 4.8.2010, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



skyboy, explain говорит:
Цитата

id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra
1  SIMPLE  tasks  ALL  NULL  NULL  NULL  NULL  29250194  Using where



skyboy, сколько на это времени примерно уйдёт? Подозреваю что не мало.
PM   Вверх
nIkTo
Дата 4.8.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Код

alter table tasks add index (status)

прошло 2 часа, поле ещё индексируется =)

Что быстрее бы отрабатывало (выборка из базы), если для поля status использовать (имеет 3 состояния) :
  • status tinyint(1) not null default 0,  key (status)
  • status int(1) not null default 0,  key (status)
  • status set('0','1','2') not null default 0, key (status)
  • status tinyint(1) not null default 0,  key (status(1))
  • status int(1) not null default 0,  key (status(1))
  • status set('0','1','2') not null default 0, key (status(1))

PM   Вверх
skyboy
Дата 4.8.2010, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(nIkTo @  4.8.2010,  17:14 Найти цитируемый пост)
Что быстрее бы отрабатывало

практически пофиг.
Цитата(nIkTo @  4.8.2010,  17:14 Найти цитируемый пост)
прошло 2 часа, поле ещё индексируется =)

что-то помнится мне, что для задачи полной (пере)индексации создают копию структуры таблицы с индексом, перегоняют туда данные и переименовывают копию в имя оригинала.
PM MAIL   Вверх
gcc
Дата 5.8.2010, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



включи в логах логировать запросы которые долго выполняются...

если фрейворк, то можно влючить отладку и смотреть в каких участках медленно выплняются действия

в сложно запросе очень часто можно сделать ошибку, где mysql будет грузить сильно CPU





PM WWW ICQ Skype GTalk Jabber   Вверх
nIkTo
Дата 5.8.2010, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Цитата(skyboy @  4.8.2010,  21:10 Найти цитируемый пост)
что-то помнится мне, что для задачи полной (пере)индексации создают копию структуры таблицы с индексом, перегоняют туда данные и переименовывают копию в имя оригинала. 


подскажите как правильней будет перегнать данные в новую таблицу.
PM   Вверх
skyboy
Дата 5.8.2010, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



я точно не уверен. поиском найти не смог. может, кто-то ещё подскажет.
PM MAIL   Вверх
skyboy
Дата 5.8.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



нашел. я дезинформировал тебя. это было на хабре. и идея не просто в создании копии таблицы, а в последующей подмене MYI-файлов. А затем REPAIR TABLE
Внимание: в той статье говорится о создании уникального индекса. Применимо ли указанное к неуникальному индексу - для меня загадка.
жаль, что без подмены файлов не обойдется :(
PM MAIL   Вверх
nIkTo
Дата 5.8.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Дело в том что 
Код

alter table tasks add index (status)
 отработал, но теперь база ведёт себя как-то не адекватно =( выполнение запроса 
Код

select count(*) from tasks where status='done'
 , вообще не выполняется, точнее мускул начинает обрабатывать этот запрос (видно через дерево процессов) но потом процесс пропадает а ответа нету =(

что делать ?

Добавлено через 4 минуты и 6 секунд
Запросы типа 
Код

select * from tasks where status='wait' limit 2000
 отрабатывают на ура, в чем тут трабл =(

Добавлено через 6 минут и 23 секунды
explain говорит :
Код

explain select count(*) from tasks where status='done'


Цитата

id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra
1  SIMPLE  tasks  ref  status  status  12  const  12326762  Using where; Using index

PM   Вверх
skyboy
Дата 5.8.2010, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



долго индекс создавался-то?
к сожалению, помочь не могу(даже боюсь навредить - опыта работы с такими большими таблицами у меня нет). стоит посмотреть в логах. может, ошибка загрузки индекса в память или ещё что.
Цитата(nIkTo @  5.8.2010,  10:44 Найти цитируемый пост)
отрабатывают на ура

быстрее, после создания индекса?
PM MAIL   Вверх
nIkTo
Дата 5.8.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



skyboy, индекс около 4х часов создавался. Гораздо быстрее стало, раньше ~ 10 сек теперь меньше секунды =)
PM   Вверх
Zloxa
Дата 6.8.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(nIkTo @  5.8.2010,  11:44 Найти цитируемый пост)
explain говорит :

весьма вероятно, для запроса select count(*) from tasks where status='done', использование индекса происходит не на благо а во вред. А план показывает что индекс использвуется.
Если более 20% записей попадают под критерий status='done', то использование индекса для отбора по этому предикату, как правило, оказвается не эффективным. Если этот тот самый случай, лучше подсказать оптимизатору, что индекс использовать не стоит.



Это сообщение отредактировал(а) Zloxa - 6.8.2010, 10:46


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
nIkTo
Дата 6.8.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 5.7.2007

Репутация: нет
Всего: нет



Zloxa, действительно, игнорируя индекс запрос :
Код

explain select count(*) from tasks ignore index (status) where status='done'

выполняется, хотя и не так быстро как хотелось бы.
PM   Вверх
Zloxa
Дата 6.8.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(nIkTo @  6.8.2010,  11:49 Найти цитируемый пост)
не так быстро как хотелось бы. 

было бы настораживающе странно, если бы 30млн записей пересчитались мгновенно.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1188 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.