我在今天第一次出现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 |
+----+--------------------+------------+----------------+----------------------------------------------------+---------------------+---------+------+-------+------------------------------------+
答案 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