Php 如何动态过滤MySQL中的某些行以进行查询?
我有一个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
devicevalue
它的结构是这样的
devId | vals | date | time
xysz | 23 | 2020.02.17 | 22.06
abcs | 44 | 2020.02.31 | 22.07
VAL列保存温度值。
任何登录我的webapp的用户只能访问某些设备
以下是步骤
我的问题是,是否有任何方法可以在步骤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` );