我们有一个session表,用来存储每天使用我们程序的计算机设备情况,有两个字段inputtime,device_uuid,分别用来存储时间和计算机的设备id(全球唯一),这个表中目前有20w条数据,inputtime字段做了索引.以前计算每天新增的计算机用户是这样计算的 SELECT count(DISTINCT device_uuid) FROM session WHERE inputtime <='今天时间';     SELECT count(DISTINCT device_uuid) FROM `mobile_session` WHERE inputtime <='昨天时间'; 用今天的减去昨天的,就可以得到每天的新增用户了.后来感觉这样做,每次都要进行两次全表搜索,效率不高,我们就新建了一张device表,目前有20000条数据,有一个字段deviceid,用来存储所有昨天之前使用过我们的程序的计算机设备id,然后今天新增的用户可以这样计算   SELECT count(DISTINCT device_uuid) from session where inputtime>='昨天' and inputtime <='今天' AND DEVICE_UUID NOT IN (SELECT deviceid FROM device ); 发现速度非常慢...请问如何优化呢?
貌似每次都会进行20w乘以2w次检索...

解决方案 »

  1.   

    SELECT count(DISTINCT device_uuid) FROM session WHERE inputtime between '昨天时间'; and  <='今天时间';这样不就一次就全部查出了么??
      

  2.   

    换成JOIN,不用IN来试试。SELECT count(DISTINCT device_uuid) 
    from session a left join (SELECT deviceid FROM device ) b on a.DEVICE_UUID=b.deviceid
    where inputtime>='昨天' and inputtime <='今天' 
    AND b.deviceid is null
      

  3.   


    昨天时间和今天时间之间可能有一些device_uuid在之前出现过 
    你的语句只能获取今天的独立用户 但不能获取新增用户啊
      

  4.   

    那就换成这个试试。另外贴出你的 
    show index from session;
    show index from device;
      

  5.   

    SELECT count(DISTINCT device_uuid) from session where inputtime>='昨天' and inputtime <='今天' AND DEVICE_UUID NOT IN (SELECT deviceid FROM device );
    索引情况如何,在inputtime、DEVICE_UUID上建立复合索引
    在deviceid上建立索引