MYSQL使用null检查内容

时间:2016-06-15 10:48:13

标签: mysql datetime

MySQL新手在这里。

我的db.TableA长达700万行。 简化的结构是:

DateTime as datetime (primary key)
Value as float.

看起来很多人在这里要求查询以提取日期时间恰好在给定日期时间之前/之后的行。 在这种情况下的查询类似于:

select * from `TableA` where `DateTime`<'2016-06-01 00:00:23' order by `DateTime` desc limit 1; 
select * from `TableA` where `DateTime`>'2016-06-01 00:00:23' order by `DateTime` limit 1; 

它们非常快,在我的慢速数据库服务器上只有几毫秒。

这里开始有趣

唉,我有一个扭曲,使一切都慢得多。 即使Value不可用,外部设备也会写入行 。 这意味着我的数据库由

之类的行填充
DateTime                Value
------------------------------
'2015-05-04 12:34:56'   Null

问题:我需要在给定日期时间之前/之后找到第一行日期时间并且值不为空

将新条件添加到先前的查询会使它们非常慢(从几毫秒到超过一分钟):

select * from `TableA` where `DateTime`<'2016-06-01 00:00:23' and Value is not null order by `DateTime` desc limit 1;

我假设没有空检查,所有都很快,因为它基于索引的DateTime,当检查空条件时,表格被完全分析。

是否有更好的方法可以更好地为此添加搜索?

我想搜索:

  • 上一行(DateTime&lt;给定日期时间)
  • ,Value not null
  • 但只有在DateTime之前它少于1000行(在任何情况下,对我来说选择对我的计算来说太旧的行都没用。)

欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

在子查询中首先选择给定日期时间之前的最多1,000行,按反向时间顺序对它们进行排序,然后从那些具有非NULL值的1,000行中选择第一行。

SELECT * FROM (
    SELECT * FROM TableA
    WHERE `DateTime` < '2016-06-01 00:00:23'
    ORDER BY `DateTime` DESC LIMIT 1000) tmp
WHERE tmp.Value IS NOT NULL LIMIT 1

这应该更快,因为您不必扫描整个表中的非NULL值,只需扫描最近的1000。据推测,DateTime上有一个索引可以快速选择子查询。