Производительность индекса MySQL на небольших «быстро меняющихся» таблицах - PullRequest
2 голосов
/ 19 января 2010

У нас есть таблица, которую мы используем в качестве очереди. Записи постоянно добавляются, постоянно обновляются, а затем удаляются. Хотя мы можем добавлять 3 записи в секунду, таблица никогда не будет больше нескольких сотен строк.

Чтобы получить записи из таблицы, мы делаем простой выбор.

SELECT * FROM queue_table WHERE some_id = ?

Мы обсуждаем добавление индекса по some_id. Я думаю, что маленький размер и скорость, с которой мы добавляем и удаляем строки, говорят «нет», но условно нам кажется, что у нас должен быть индекс.

Есть мысли?

Ответы [ 3 ]

3 голосов
/ 22 января 2010

Если вы используете InnoDB (что вы должны делать с таблицей такого рода), и к таблице обращаются одновременно, то вам обязательно нужно создать индекс.

При выполнении операций DML InnoDB блокирует все сканируемые строки, а не только те, которые соответствуют условиям условия WHERE.

Это означает, что без индекса запрос будет выглядеть так:

DELETE
FROM    mytable
WHERE   some_id = ?

придется выполнить полное сканирование таблицы и заблокировать все строки.

Это убивает весь параллелизм (даже если потоки обращаются к различным some_id, им все равно придется ждать друг друга), и может даже привести к взаимоблокировке.

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

0 голосов
/ 19 января 2010

Единственный способ узнать наверняка - это выполнить некоторые тесты в реальных / реальных условиях; например, измерьте время, которое занимает каждый запрос, и:

  • на один день, собирать эту информацию при каждом запуске запроса - без индекса
  • и на другой день сделайте точно так же - с индексом.

Для таблицы с несколькими сотнями строк, выполняющих как лоты, так и операции вставки / удаления и выбора / обновления, разница не должна быть такой большой, поэтому я думаю, что вы можете протестировать в своей производственной среде (и в реальных условиях) без особой опасности.


Да, я знаю, тестирование на производстве - это плохо; но в этом случае это лучший способ узнать наверняка: эти условия, вероятно, слишком сложно воспроизвести в среде тестирования ...

0 голосов
/ 19 января 2010

Конечно, потребуется эталонный тест с использованием обоих методов.

Но, как правило, если доступ составляет 50% для чтения и 50% для записи, штраф за обновление индекса может не стоить того. Но если количество строк увеличивается, это взвешивает производительность чтения и записи, так что следует использовать индекс.

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