mysql时间字段怎么加索引

发布于 2022-09-07 19:58:58 字数 334 浏览 18 评论 0

查询时需要根据时间字段进行范围查询,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 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

疾风者 2022-09-14 19:58:58

看看你表的数据量是多少,如果很多,上万级别的,就算时间加了索引了也会很慢的。
某些情况下,由于数据量大,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执行这么慢。

七颜 2022-09-14 19:58:58

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

鱼忆七猫命九 2022-09-14 19:58:58

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

作妖 2022-09-14 19:58:58

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

緦唸λ蓇 2022-09-14 19:58:58

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文