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

标签 mysql sorting indexing timestamp sql-update

我正在使用 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/

相关文章:

mysql - 在父子层次结构中排序

MySQL:数据库名称作为 View 中的参数

JQuery 表排序器 : How to show the arrows on one column only

c++ - 对象 C 的排序列表;选择字段

sql - 表中唯一字段的索引是否允许立即发生选择计数(*)?如果不是,为什么不呢?

java - 使 GWT (Ajax) URL 可抓取/可索引的正确方法

php - 我可以在没有 MySQL 表的情况下将 CSS 值保存在我的 Wordpress 主题中吗?

mySQL - 列的总和

javascript - Angular UI网格无法对具有行索引的列进行排序

sql - 如何正确索引数据库以提高查询性能