Зависает SELECT в MySQL

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
xaos13
проходил мимо
Сообщения: 6
Зарегистрирован: 2010-05-12 16:41:54

Зависает SELECT в MySQL

Непрочитанное сообщение xaos13 » 2010-07-28 18:39:33

Приветствую всех.

Возникла проблема с с базой. Симптомы следующие:

Имеется таблица MyISAM, размер 6Гб, 9млн 500тыс записей. Структура таблицы:

Код: Выделить всё

CREATE TABLE `frases` (
 `fid` int(11) NOT NULL AUTO_INCREMENT,
 `key` varchar(32) NOT NULL,
 `lema` varchar(512) NOT NULL,
 `frase` varchar(512) NOT NULL,
 `time` datetime NOT NULL,
 `nf` varchar(512) DEFAULT NULL,
 `show` int(11) DEFAULT '-1',
 `site_list` text NOT NULL,
 `direct` varchar(2048) DEFAULT NULL,
 `site_cat` varchar(10000) DEFAULT NULL,
 PRIMARY KEY (`fid`),
 UNIQUE KEY `key` (`key`)
) ENGINE=MyISAM AUTO_INCREMENT=41316431 DEFAULT CHARSET=cp1251

На сервере 8Гб оперативной памяти.

Настройки MySQL:
[code]
table_open_cache = 1000
query_cache_size = 1024M
query_cache_limit = 32M
read_rnd_buffer_size = 32M
sort_buffer_size = 512M
key_buffer_size = 2048M
tmp_table_size = 64M
max_heap_table_size = 64M
thread_cache_size = 128
innodb_buffer_pool_size = 2048M
max_allowed_packet = 16M
concurrent_insert = 2
myisam_stats_method = nulls_equal
key_cache_division_limit = 75
optimizer_search_depth=10
Проблема - примерно раз в сутки запрос "SELECT `fid` FROM frases WHERE `key` = '9e6ef9a789b1ac7879a9c2d70cd31037' LIMIT 1" зависает в статусе "statistics".
Обычно к таблице параллельно обращаются обращаются ~15 скриптов. Некоторые делают аналогичные выборки с другими значениями `key`, некоторые делают Insert и Update таблицы frases. Зависший запрос не получается остановить командой kill.

Может кто помочь разобратся или направить в нужное русло.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

FiL
ст. лейтенант
Сообщения: 1374
Зарегистрирован: 2010-02-05 0:21:40

Re: Зависает SELECT в MySQL

Непрочитанное сообщение FiL » 2010-07-29 5:09:52

а зачем limit 1 если key уникальный ключ? Ведь ясно, что результат по-любому будет 1 (если вообще будет).

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Зависает SELECT в MySQL

Непрочитанное сообщение hizel » 2010-07-29 10:42:56

myisam такой myisam
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Зависает SELECT в MySQL

Непрочитанное сообщение zg » 2010-07-29 19:06:43

первое, надо урезать длину индекса до 10-12 символов
второе, возможно, разбить на партиции по индексу на 4-6 символов

xaos13
проходил мимо
Сообщения: 6
Зарегистрирован: 2010-05-12 16:41:54

Re: Зависает SELECT в MySQL

Непрочитанное сообщение xaos13 » 2010-08-05 10:43:55

Урезали не помогает
Вот новый конфиг

Код: Выделить всё

socket=/tmp/mysql2.sock
table_open_cache = 1000
query_cache_size = 128M
query_cache_limit = 32M
read_rnd_buffer_size = 32M
myisam_sort_buffer_size = 500K
sort_buffer_size = 500K
key_buffer_size = 2048M
tmp_table_size = 64M
max_heap_table_size = 64M
thread_cache_size = 128
innodb_buffer_pool_size = 2048M
max_allowed_packet = 16M
slow-query-log-file = /usr/local/mysql-db2/slow-queries.log
concurrent_insert=2
myisam_stats_method=nulls_equal
key_cache_division_limit=75
optimizer_search_depth=10