sql 时间字段加索引问题

时间字段,int类型(内容时间戳)
这个字段内容不是唯一,但是大多查询都会对这个字段做 order by 该字段 desc排序查询
请问这样的字段如何加索引?谢谢!!!

阅读 15.6k
4 个回答

索引主要看where和order by 后面的条件,如果仅是按时间排序,直接加一个时间字段的索引就好,如果还有其它条件,可以建联合索引。

CREATE INDEX PersonIndex ON Person (updateTime DESC) ;
 -- 对应的查询语句
SELECT * FROM Person ORDER BY updateTime DESC LIMIT 10;

CREATE INDEX IndUpdateName ON Person (updateTime DESC, name) ;
 -- 对应的查询语句
SELECT * FROM Person WHERE name like '%王' ORDER BY updateTime DESC LIMIT 10;

一定要通过EXPLAIN反复比较加不加索引的效果。

加普通索引就行了,需要优化的话请贴出explain

谢谢邀请。
之前写过一篇索引的文章介绍过你说的这种情况:

mysql一张表查询只能用到一个索引。因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。这一点是很多程序猿容易忽略的,如where子句的字段建了索引,排序的字段建了索引,但是分开建的,以为会走索引,其实这样的话排序的字段不会使用索引的,除非建复合索引,切记。

如果这个时间字段只是用来order by,基本按上面的套路来就可以了,记得用Explain来分析性能是否有提升。
如果这个时间字段还有做范围的查询,则需要额外考虑下面的规则:

组合索引时切记此条约束:组合索引中有多个字段,其中一个字段是有范围判断,则需将此字段在最后面。

希望回答对你能有所帮助。

  • InnoDB,下Int类型字段加索引,性能上应该有明显提升。而使用MyISAM引擎下,则需要留意,加索引的效果并不一定理想,甚至有可能出现反效果。
  • 另外在写SQL时,不要犯低级的错误,如把int转换成datetime去做比较条件。
  • 配合使用EXPLAIN做优化是个不错的选择,必要时,可以模拟一些生产环境的数据做下性能测试 。

:)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题