经常更新的mysql索引时间戳列

时间:2013-11-17 15:54:58

标签: mysql sorting indexing timestamp sql-update

我正在使用mysql(innoDB)。我有一个包含这些列的大型用户表: USER_ID,last_action_time。 user_id是唯一的主键。该表有大约5百万行。

+------------------+-----------+------+-----+---------+-------+
| Field            | Type      | Null | Key | Default | Extra |
+------------------+-----------+------+-----+---------+-------+
| user_id          | int(11)   | NO   |     | NULL    |       |
| last_action_time | timestamp | YES  |     | NULL    |       |
+------------------+-----------+------+-----+---------+-------+

每当用户在网站上执行操作时,我都会更新last_action_time列中的时间戳。 对于后台系统,我需要显示在网站上进行操作的最后30位用户。 像这样:

SELECT user_id,last_action_time FROM user_table ORDER BY last_action_time DESC LIMIT 30

这需要很多时间。我考虑过对last_action_time进行索引,但我担心我会遇到问题,因为last_action_time列非常频繁地进行更新。我怎么能有一个具有索引但又经常更新的列

1 个答案:

答案 0 :(得分:2)

如果您需要搜索last_action_time列,则需要有索引。确实,更新索引会稍微减慢每个更新查询的速度。

如果您不愿意创建索引,或者只是将查询的频率与效率进行比较。

  • 更新:每个更新的行,您将更新索引中的一个指针。只要您的索引在内存中,效率损失就会非常低(当然,除非您在非常少量内存上运行)。
  • 选择:您的选择查询将需要执行全表扫描而不是索引读取。测试您将加快查询速度。它可以快100倍或快1000倍,具体取决于桌子的大小。

现在决定:

  • 更新查询的非常小的惩罚不会减轻选择查询的巨大好处。还要考虑全表扫描的其他问题(缓存失效)。
  • 如果您有1000个或10个更新的1个选择查询,则可以开始考虑删除索引。如果您更频繁地选择,请不要犹豫。