Почему на моем столе очень медленно, но редко - PullRequest
2 голосов
/ 17 мая 2011

У меня есть индекс на Uid и 5 других столбцов. В 99,9% случаев этот запрос выполняется менее чем за тысячную долю секунды:

SELECT * FROM player_data WHERE uid = 100000089905929

но время от времени это занимает 4 секунды или больше. Таблица myisam и имеет 60000 строк. Моя информация о времени выполнения mysql показывает, что максимальное количество одновременных подключений было 21 (нигде рядом с моим максимальным количеством максимальных подключений или использования памяти).

Есть ли вероятность того, что другие индексы замедляют это (возможно, потому что БД пришлось пересчитать индексы или что-то в этом роде?)

Странно то, как редко это происходит (примерно 5 раз за 12 часов - в течение которых было бы сделано 1000 таких звонков). Что я могу сделать, чтобы смягчить это? (кроме шардинга)

1 Ответ

2 голосов
/ 18 мая 2011

На мой взгляд, наиболее вероятным объяснением является то, что таблица заблокирована.Поскольку MyISAM использует блокировку на уровне таблицы, если вы запускаете обновление для этой таблицы, выполнение которого занимает 5 секунд, и одновременно выполняете оператор SELECT, оператор select будет ожидать завершения обновления и, следовательно, для выполнения потребуется 5 секунд.

Вот несколько полезных сведений о блокировке таблицы: http://dev.mysql.com/doc/refman/5.1/en/table-locking.html

Существует несколько параметров конфигурации, которые могут помочь в зависимости от причины вашего конфликта:

  • Есликонфликт между SELECT и INSERT, вы можете установить на сервере concurrent_insert=2, чтобы разрешить одновременные вставки, даже если таблица фрагментирована.
  • Если конфликт находится между SELECT и UPDATE, вы можете установить low_priority_updates=TRUE на сервере на «Предоставлять операциям модификации таблиц (INSERT, REPLACE, DELETE, UPDATE) более низкий приоритет, чем выбирает.»
  • Еслиэто не помогает, вы можете попытаться ускорить UPDATE, DELETE или REPLACE, добавив индексы, или разбить UPDATE, DELETE или REPLACE на более мелкие части, чтобы он работал быстрее.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...