Большое обновление MySQL Table Slow - PullRequest
0 голосов
/ 03 сентября 2010

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

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 = MySAM CHARSET DEFAULT = utf8 COLLATE = utf8_unicode_ci AUTO_INCREMENT = 1947722;

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

Ответы [ 2 ]

3 голосов
/ 03 сентября 2010

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

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

0 голосов
/ 03 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...