Php 如何动态过滤MySQL中的某些行以进行查询?

Php 如何动态过滤MySQL中的某些行以进行查询?,php,mysql,datetime,indexing,query-performance,Php,Mysql,Datetime,Indexing,Query Performance,我有一个PHP-MySQL设置。我有一个表devicevalue它的结构是这样的 devId | vals | date | time xysz | 23 | 2020.02.17 | 22.06 abcs | 44 | 2020.02.31 | 22.07 VAL列保存温度值。 任何登录我的webapp的用户只能访问某些设备 以下是步骤 在我的网站上,“用户”从和中选择他想要查看数据的日期并提交 然后,这些日期被传递到一个页面“getrecord

我有一个PHP-MySQL设置。我有一个表
devicevalue
它的结构是这样的

devId | vals | date          | time
xysz  | 23   | 2020.02.17    | 22.06
abcs  | 44   | 2020.02.31    | 22.07


VAL列保存温度值。 任何登录我的webapp的用户只能访问某些设备

以下是步骤

  • 在我的网站上,“用户”从和中选择他想要查看数据的日期并提交
  • 然后,这些日期被传递到一个页面“getrecords.php”,其中有很多选择查询(很多都在循环中)以获取所需格式的过滤数据
  • 问题是这个表包含了近200-300万条记录。在每一个where子句中,我必须添加条件。这将导致在整个表中进行搜索


    我的问题是,是否有任何方法可以在步骤1中获取临时表,该表基于给定的两个日期只有特定的行,然后我在其他页面上的所有查询都将针对该临时表?

    编辑:如果您的
    日期
    列是文本字符串,您必须将其转换为类型为
    DATE
    TIMESTAMP
    的列,否则您将永远无法从该表中获得良好的性能。MySQL服务器中有大量优化代码,可以有效地处理时间/日期数据类型。如果将日期或时间存储为字符串,则会破坏所有优化代码

    然后,在你的
    date
    列上放置一个索引,如下所示

    CREATE INDEX date_from_to ON devicevalue (`date`, devId, vals, `time` );
    
    它被称为覆盖索引,因为只有使用它才能满足整个查询

    然后,在查询中使用

       WHERE date >= <<<fromdate>>> 
         AND date <  <<<todate>> + INTERVAL 1 DAY
    
    如果您有机会更改此表的布局,请将
    日期
    时间
    列合并为具有时间戳数据类型的单个列。如果您这样做,上面我向您展示的WHERE子句仍然可以正确工作。一切都会一样快


    SQL是用来简单快速地解决您的问题的。有了良好的数据选择和适当的索引,几百万条记录就是一个中等大小的表。

    简短回答:不。不要设计需要在会话之间活动的临时表

    详细回答:

    将日期范围从一个页面传递到下一个页面,然后在

    然后确保为可能的查询提供了良好的复合索引。但是,要做到这一点,你必须对可能被要求的东西有所感觉。您可能需要少量的多列索引

    您可能可以从表单条目构建一个
    SELECT
    。我很少需要使用多个查询,但它大多是基于表单动态“构造”的

    日期
    时间
    分别设置列很少是个好主意。例如,它使我们很难把一天的中午说成是第二天的中午。组合成
    日期时间
    时间戳


    O.JONS已经说过了很多我通常会在这里添加的内容。

    参阅,并考虑把日期和时间存储为一个单一的实体,我应该让你们这样做,在我尝试回答您之前。当前我的日期和时间是字符串格式。如果我将其类型更改为时间戳,我是否可以期望在获取时间方面的性能提高?是,不要对日期/时间戳字段使用字符串格式。请看我的编辑。谢谢你。根据您的情况,什么类型的日期时间或时间戳更合适?大多数查询(在PHP中)都需要我获取相隔5分钟或10分钟的记录。
    CREATE INDEX date_id_from_to ON devicevalue (devId, `date`, vals, `time` );