Простой запрос на обновление MySQL иногда медленный - PullRequest
1 голос
/ 05 декабря 2011

У меня есть простой запрос, который обычно выполняется в течение 0,0002 секунд.Иногда (например, 1 из 200) выполнение запроса может занять до 1000 раз.

Медленный журнал запросов:

# Time: 111205 12:21:21
# User@Host: abc[abc] @ localhost []
# Query_time: 0.120205  Lock_time: 0.000025 Rows_sent: 0  Rows_examined: 1
SET timestamp=1323084081;
UPDATE `users` 
SET `online`=NOW(), 
     lastip='123.123.123.123', 
     pageviews = pageviews + '1', 
     onlinetoday = '1' 
WHERE `user_name`='Alex' 
LIMIT 1;

Поле user_name проиндексировано.Обновленные поля (online, lastip, pageviews и onlinetoday) не являются.

Та же проблема возникает при использовании первичного ключа (A_I, int(35)) вместоuser_name (varchar(50).

Таблица содержит 22 000 строк и 68 полей, 5 из них являются индексами.

У меня также есть другая таблица, которая точно такая жепроблема:

CREATE TABLE `person_values` (
 `id` int(255) NOT NULL,
 `A1` int(255) NOT NULL DEFAULT '0',
 `A2` int(255) NOT NULL DEFAULT '0',
 `A3` int(255) NOT NULL DEFAULT '0',
 `A4` int(255) NOT NULL DEFAULT '0',
 `A5` int(255) NOT NULL DEFAULT '0',
 `A6` int(255) NOT NULL DEFAULT '0',
 `A7` int(255) NOT NULL DEFAULT '0',
 `A8` int(255) NOT NULL DEFAULT '0',
 `A9` int(255) NOT NULL DEFAULT '0',
 `A10` int(255) NOT NULL DEFAULT '0',
 `A11` int(255) NOT NULL DEFAULT '0',
 `A12` int(255) NOT NULL DEFAULT '0',
 `A13` int(255) NOT NULL DEFAULT '0',
 `A14` int(255) NOT NULL DEFAULT '0',
 `A15` int(255) NOT NULL DEFAULT '0',
 `A16` int(255) NOT NULL DEFAULT '0',
 `A17` int(255) NOT NULL DEFAULT '0',
 `A18` int(255) NOT NULL DEFAULT '0',
 `A19` int(255) NOT NULL DEFAULT '0',
 `A20` int(255) NOT NULL DEFAULT '0',
 `A21` int(255) NOT NULL DEFAULT '0',
 `A22` int(255) NOT NULL DEFAULT '0',
 `A23` int(255) NOT NULL DEFAULT '0',
 `A24` int(255) NOT NULL DEFAULT '0',
 `A25` int(255) NOT NULL DEFAULT '0',
 `A26` int(255) NOT NULL DEFAULT '0',
 `A27` int(255) NOT NULL DEFAULT '0',
 `A28` int(255) NOT NULL DEFAULT '0',
 UNIQUE KEY `person` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

Запрос:

UPDATE `person_values` SET A25 = A25 + 1 WHERE id = '1' LIMIT 1;

Таблица person_values содержит около 28 000 строк.

Версия сервера Mysql: 5.1.49-3-log Mysqlверсия клиента: 5.1.49 Distro: Debian 6.0.3

Что может быть причиной этой проблемы?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2011

Если вам не нужно сразу читать строку, которую вы только что изменили, вы можете попробовать заменить оператор UPDATE на REPLACE DELAYED (примечание: их синтаксис отличается! К сожалению, нет UPDATE DELAYED ...)и посмотрим, поможет ли это.

0 голосов
/ 05 декабря 2011

Если бы это был InnoDB, я бы ответил: обновление происходит быстро, когда строка находится в пуле буферов, в противном случае оно должно сначала загружаться в пул буферов, затем обновляться и, наконец, записываться обратно. MyISAM работает аналогичным образом, он должен открыть таблицу и найти запись, чтобы обновить ее. Поэтому простой запрос иногда занимает 0,1 секунды, что вполне приемлемо. Вы можете увеличить соответствующие настройки (например, сколько таблиц MySQL может держать открытыми и некоторые буферы, если они используются в MyISAM), чтобы сделать это редко или никогда не происходить.

0 голосов
/ 05 декабря 2011
  1. пожалуйста, опубликуйте соответствующие части вашей схемы: SHOW CREATE TABLE tbl_name.
  2. проверьте, установлен ли размер индекса для user_name, так как вы, скорее всего, используете столбец varchar.Вы должны установить длину в символах для индекса по такому столбцу, как: CREATE INDEX part_of_name ON customer (name(10));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...