0

我正在从今天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 |
+----+--------------------+------------+----------------+----------------------------------------------------+---------------------+---------+------+-------+------------------------------------+
4

1 回答 1

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
于 2013-07-19T01:34:40.613 回答