Какой тип таблицы выбрать?

Ямерт

The Old One
Какой тип таблицы выбрать?

Привет!

Такая ситуация: есть таблица типа MyISAM, в ней порядка 5,000 записей. Запросы в основном UPDATE, реже INSERT, SELECT вообще экзотика. В таблице хранятся данные о том, сколько раз просматривалась та или иная статья. Портал, где публикуются данные статьи, очень посещаем. Админ начал жаловаться, что на сервере висит много процессов, которые ждут доступа на UPDATE в эту самую таблицу.
Оказывается, при UPDATE таблица MyISAM лочится полностью, не только затрагиваемые ряды (как это, к примеру, в InnoDB).

Пока решение проблемы вижу в том, чтобы поменять тип таблицы на InnoDB.
Что посоветуете, профессионалы MySQL?
 
поменять то можно, но innoDB само по себе медленнее работает. Может стоит пересмотреть логику апдейта ?
 
Да там в общем-то и оптимизировать нечего:
update ARTICLE_VIEWS set VIEWS=VIEWS+1 where ARTICLE_ID=1111 and DATE='2004-01-29'
 
Оптимизировать надо не сам запрос а логику. например апдейтить не саму таблицу, а другую, поменьше. И по крону скидывать данные из маленькой таблицы в большую
 
Ямерт
Надеюсь у тебя составной индекс на ARTICLE_ID,DATE стоит?
 
Demiurg
Апдейт в таблице из 5 тыс записях это ерунда, он не может тормозить. Если конечно он затрагивает только несколько записей а не всю таблицу.
 
Falc
Лочится ВСЯ MyISAM-таблица по-любому, притом идёт много одновременных запросов. Тормозит ещё как. С индексами порядок.
InnoDB вроде бы медленно работает с SELECT, а с UPDATE нормально.
Demiurg можно, конечно, но это как удаление гланд через задний проход...
 
>Demiurg можно, конечно, но это как удаление гланд через задний проход...
почему , я обычно логи пишу в файл, потом по крону вытаскиваю из них нужную информацию в базу.
 
Ямерт
>>притом идёт много одновременных запросов.
Сколько?
И сколько записей в среднем апдейтится одним апдейтом?
 
Falc
Сколько - я точно не знаю, да это и не важно. Апдейтится 1 запись.
Demiurg этот вариант мне не подходит - хотят, чтобы была только одна таблица.
Попробую-таки перейти на InnoDB, посмотрим что получится.
 
Ямерт
У меня несколько запросов в секунду на апдейт в таблице из нескольких милионов записей идет и ничего.
 
создать таблицу
Код:
create table ARTICLE_VIEWS_DAY type=heap as select ARTICLE_ID,0 views from ARTICLE_VIEWS;
в течении дня апдейтить в ней записи и раз в сутки переписывать данные в основную таблицу.
 
chira
Ты думаешь из-за 5-ти тыс записей стоит такое делать?
 
chira
Это может быть сложным если апдейт завязан на даные из этой же таблицы.
 
Falc

что сложного вместо:
Код:
update ARTICLE_VIEWS set VIEWS=VIEWS+1 where ARTICLE_ID=1111 and DATE='2004-01-29' 
писать:
update ARTICLE_VIEWS_DAY set VIEWS=VIEWS+1 where ARTICLE_ID=1111
 
chira
Это при условии что автору надо обновлять статьи только с сегодняшней датой.
 
Falc
Что ты ерунду несёшь, смотрю страницу сегодня, а данные обновляю за вчера?
 
chira
Ну хорошо уговорил что для даноой задачи это будет просто, но испоьзовать тип heap для такой таблицы не правильно, т.к. при сбое мы можем потерять данные за целый день.
Опять же подчеркуну что для такой простой задачи я бы не стал вводить дополнительную таблицу. Я вообще не понимаю как апдейт не индексного поля может тормозить или у автора на него кучу индексов навешано.
 
Сверху