qq243920161
qq243920161
采纳率0%
2019-09-27 16:25 阅读 2.0k

为什么MySQL的单表查询这么慢,10条记录要6秒钟

数据量大概200w左右,查10条记录要6秒钟,这个绝对不能忍,有什么办法可以优化吗

SQL语句

select * from device_data
where 1 = 2
or device_id = '05DAFF323037574D431268371'
and time between '2019-09-18 00:00:00' and '2019-09-19 00:00:00'
LIMIT 10

查询结果

图片说明

explain结果

图片说明

表结构

图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

9条回答 默认 最新

  • renkai721 renkai721 2019-09-27 16:28

    试下这个

    select * from device_data
    where device_id = '05DAFF323037574D431268371'
    and time between '2019-09-18 00:00:00' and '2019-09-19 00:00:00'
    LIMIT 10
    
    点赞 评论 复制链接分享
  • qq_24550901 qq_24550901 2019-09-27 16:40

    你把查询期间改一下就行了,BETWEEN TO 换成 time>= '2019-09-18 00:00:00' and time<= '2019-09-19 00:00:00'

    点赞 评论 复制链接分享
  • xxq250 xxq250 2019-09-27 17:02

    time 列加索引,device_id 命中行太多,索引失效状态

    点赞 评论 复制链接分享
  • niaonao niaonao 2019-09-27 17:18
    • 索引 你应该加过了
    • where id > offset 查询条件添加 id 大于偏移量,比如这里是id>200W
    • select id,type 避免select *
    点赞 评论 复制链接分享
  • weimingjue 王能 2019-09-29 11:13

    请再次确认以下:
    1.确认device_id、time均有索引
    2.sql删掉1=2

    点赞 评论 复制链接分享
  • yyjjttww yyjjttww 2019-09-29 15:49

    加个联合索引试一下吧

    点赞 评论 复制链接分享
  • qq_38227717 AT152S 2019-09-29 17:05

    把select * 换成需要的字段吧 where 1 = 2 去掉

    点赞 评论 复制链接分享
  • qq_36553707 我是混子我怕谁 2019-10-03 12:21

    把and搞掉,换成union
    (select * from device_data
    where device_id = '05DAFF323037574D431268371'
    union select * from device_data
    where time between '2019-09-18 00:00:00' and '2019-09-19 00:00:00')
    LIMIT 10

    两个结果求交集,没记错的话好像是这样
    虽然不知道为什么要这么用,但是我看别人写的优化语句是这样的

    点赞 评论 复制链接分享
  • weixin_42080504 have_power 2019-10-09 14:09

    我看看你这张表的存储引擎。

    点赞 评论 复制链接分享

相关推荐