Mysql连接到同一个表,其中列仅出现在今天

时间:2013-07-19 00:58:13

标签: mysql sql join subquery

我在今天第一次出现dT的表中搜索dT(以及其他一些信息)的所有出现。到目前为止这是我的sql。工作...但速度慢(我的7.9M记录表真的很慢)......但是很有效。想要做得更好吗?我知道它可以通过连接而不是子查询来解决,但我不确定如何。 tS是一个unix纪元时间戳。

听起来很简单......但结构如下:

id int(11) not null auto_increment
dT varchar(64)
lA double
lO double
tS int(11)

这是SQL:

select dT, round(lO,4), round(lO,4), tS from table_name where unix_timestamp(curdate()) <= tS and dT not in (select distinct(dT) from table_name where unix_timestamp(curdate()) > tS) order by tS desc

另外:有人要求索引并解释......所以这就是。


好的,所以dT被索引为tS。

+----+--------------------+------------+----------------+----------------------------------------------------+---------------------+---------+------+-------+------------------------------------+
| id | select_type        | table      | type           | possible_keys                                      | key                 | key_len | ref  | rows  | Extra                              |
+----+--------------------+------------+----------------+----------------------------------------------------+---------------------+---------+------+-------+------------------------------------+
|  1 | PRIMARY            | table_name | range          | idx_table_name_ts                                  | idx_table_name_tS   | 5       | NULL | 86180 | Using where                        |
|  2 | DEPENDENT SUBQUERY | table_name | index_subquery | idx_table_name_dT,idx_table_name_tS                | idx_table_name_dT   | 67      | func |   142 | Using where; Full scan on NULL key |
+----+--------------------+------------+----------------+----------------------------------------------------+---------------------+---------+------+-------+------------------------------------+

1 个答案:

答案 0 :(得分:1)

在子查询中尝试NOT EXISTS而不使用DISTINCT

SELECT dT, ROUND(lO, 4) lO1, ROUND(lO, 4) lO2, tS 
  FROM table_name d
 WHERE UNIX_TIMESTAMP(CURDATE()) <= tS 
   AND NOT EXISTS 
(
  SELECT 1 
    FROM table_name 
   WHERE dt = d.dt 
     AND UNIX_TIMESTAMP(CURDATE()) > tS
) 
 ORDER BY tS DESC