Медленное обновление большой таблицы MySQL

Привет, это моя структура таблицы

CREATE TABLE IF NOT EXISTS `sms_report` (
 `R_id` int(11) NOT NULL auto_increment,
 `R_uid` int(11) NOT NULL,
 `R_smppid` varchar(100) collate utf8_unicode_ci NOT NULL,
 `R_from` varchar(10) collate utf8_unicode_ci NOT NULL,
 `R_status` longtext collate utf8_unicode_ci NOT NULL,
 `R_message` text collate utf8_unicode_ci NOT NULL,
 `R_numbers` longtext collate utf8_unicode_ci NOT NULL,
 `R_timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `R_timedate` varchar(40) collate utf8_unicode_ci NOT NULL,
 `R_show` int(11) NOT NULL default '1',
 `oldformat` tinyint(1) NOT NULL default '0',
 PRIMARY KEY  (`R_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1947722 ;

У меня около 2 миллионов строк, поэтому, когда я обновляю здесь R_status, кажется, что это занимает слишком много времени (R_status равен 1,2,16 или 24). Подскажите как оптимизировать.


person Ron Davis    schedule 03.09.2010    source источник
comment
Вы обновляете только на основе R_id в предложении WHERE? или другие колонки? Вы можете опубликовать пример запроса UPDATE?   -  person aularon    schedule 03.09.2010
comment
пример запроса на обновление: обновление sms_report set R_status=1, где R_smppid=738sbdasdbajsdbdfbfbks782|9898773122   -  person Ron Davis    schedule 03.09.2010


Ответы (2)


Как предложил @BarsMonster, преобразуйте R_status в целое число (TINYINT, если значения только 1,2,16,24) и создайте INDEX на R_smppid. Кроме того, если R_smppid имеет фиксированную ширину, измените тип поля на char(40) или любую другую длину содержимого, или если его можно преобразовать в целое число, это еще лучше.

person aularon    schedule 03.09.2010
comment
Когда вы создаете индекс, механизм базы данных кэширует версию поля, упорядоченную для простого и быстрого поиска по запросу, поэтому, когда вы сделаете UPDATE.. WHERE indexed_field=value в следующий раз, база данных найдет эту строку намного быстрее и обновит ее, посмотрите здесь: dev.mysql.com/doc/refman/5.0/en/mysql- indexes.html - person aularon; 03.09.2010

Если R_status всегда целое, сделайте его целым. Кроме того, я бы попытался преобразовать эту таблицу в формат с фиксированной шириной строки (без varchars/texts)

Кроме того, сделайте индекс по R_smpid, без этого он будет выполнять полное сканирование таблицы при каждом обновлении.

person BarsMonster    schedule 03.09.2010