我正在使用 mysql (innoDB)。我有一个包含这些列的大型用户表: user_id,last_action_time。 user_id 是唯一的主键。该表有大约 500 万行。
+------------------+-----------+------+-----+---------+-------+
| 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 列更新非常频繁。我怎样才能拥有一个既有索引又有更新的列
最佳答案
如果您需要在列 last_action_time
上搜索,它需要有一个索引。确实,更新索引会稍微减慢每次更新查询的速度。
如果您犹豫要不要创建索引,只需将查询频率与其效率进行比较即可。
- 更新:每更新一行,您将更新索引中的一个指针。只要您的索引在内存中,效率损失就会非常低(而且肯定是,除非您在非常非常很少的内存上运行)。
- 选择:您的选择查询将需要进行全表扫描而不是索引读取。测试您将在多大程度上加快查询速度。它可能会快 100 倍或 1000 倍,具体取决于表格的大小。
现在做决定:
- 更新查询的极小惩罚不会抵消选择查询的巨大好处。还要考虑全表扫描的其他问题(缓存失效)。
- 如果您有 1 个针对 1000 或 10'000 个更新的选择查询,您可以开始考虑删除索引。如果您选择的频率更高,请不要犹豫。
关于经常更新的mysql索引时间戳列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20032770/