mysql时间字段怎么加索引

查询时需要根据时间字段进行范围查询,timestamp类型。语句没有子查询、关联查询,只查这一张表。
查出5万条结果大约需要4.5秒,这个字段已经加了普通索引,但是explain的类型还是ALL。
怎么优化?

语句是between and。换了>=和<=查询需要的时间也差不多。

SELECT id,name,sex,city,headimg FROM user WHERE starttime >='2018-05-15' AND starttime <= '2018-07-27 23:59:59' ORDER BY starttime DESC 
阅读 51.3k
5 个回答

看看你表的数据量是多少,如果很多,上万级别的,就算时间加了索引了也会很慢的。
某些情况下,由于数据量大,mysql 认为全表扫描反而快就不适用索引了。

你的这个sql可以优化下:

SELECT
    b.id,
    b.NAME,
    b.sex,
    b.city,
    b.headimg
FROM (SELECT
    id 
FROM
    USER
WHERE
    starttime >= '2018-05-15'
AND starttime <= '2018-07-27 23:59:59'
ORDER BY
    starttime DESC) a   inner join USER b on b.id = a.id; 

不要一次性返回很多的数据,如果数据多,分多次获取,其实mysql 处理sql查询很快的,时间主要耗在发起连接或回传数据(5万条数据很大了)上了,给你的感觉怎么sql执行这么慢。

泻药
索引是否被使用跟检索的索引范围在整个表中的数据量占比有关系,如果你检索了比较长的时间段,大多数情况占比20以上就会全扫了
所以你可以用force index看下到底怎么检索更快,按需选择
另外一个就是楼上@helloworld的写法,不过mysql5.7以后子查询内部排序是无效的,所以5.7的话你需要把order by放外层
最后一点,执行时间长也可能是5W条数据排序导致的,如果starttime和主键id同序的话可以去掉order by子句

你可以晒下你的sql语句吗,还有你timestamp的索引是什么?

查出多少这个没有具体关系,重要的是你有总数据量多少。然后你加了索引,如果只是一个最简单的 sql 语句的话,你先确定你的索引是否生效,是否使用索引了。

SELECT id,name,sex,city,headimg FROM user WHERE starttime >=unix_timestamp('2018-05-15') AND starttime <= unix_timestamp('2018-07-27') ORDER BY starttime DESC

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