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