mysql unix时间加索引_【mysql】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

回答

看看你表的数据量是多少,如果很多,上万级别的,就算时间加了索引了也会很慢的。

某些情况下,由于数据量大,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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值