Должен ли я индексировать столбец даты в Ruby on Rails 3.0 - PullRequest
1 голос
/ 22 июня 2011

Среда: MySql, Rails 3.0.7

В моей пользовательской таблице есть столбец 'last_activity_date', который обновляется с помощью различных хуков after_save, разбросанных по всему приложению.

Iв настоящее время имеет следующую именованную область:

scope :active, lambda { where('last_activity_date >= ?', 1.month.ago) }

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

По мере роста числа пользователей запросы с использованием «активных»Однако сфера занимает все больше и больше времени.Будет ли индексирование столбца 'last_activity_date' стоить того в долгосрочной перспективе?

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Если ваши запросы выглядят как ваш комментарий:

SELECT users.* 
FROM users
WHERE (last_activity_date >= '2011-05-22 00:26:52')
  AND (users.id >= 0)
ORDER BY users.id ASC
LIMIT 1000

, то, безусловно, да, производительность этих запросов значительно улучшится при простом индексе last_activity_date

Iпредположим, что users.id - это PRIMARY KEY таблицы, поэтому в ней уже есть индекс.


Если у вас нет индекса, запрос должен сканировать * 1012 целиком.* таблица, чтобы проверить, какие строки удовлетворяют условию last_activity_date >= 1 month ago.При небольшом количестве пользователей это становится незаметным.С тысячами (или миллионами) пользователей это будет очень медленно.

1 голос
/ 22 июня 2011

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

Вы можете сказать, насколько избирательно он использует запрос, подобный этому.

SELECT last_activity_date, count(*)
FROM users
GROUP BY last_activity_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...