我有一个包含数百列的表,但几乎所有列都为空。
该表中的每个'select'只返回一行,其中包含数百个字段。
使用PHP,我正在测试每个字段:
if (!empty($dataset["field"])) { ... }
出于优化的原因,如果我只选择有值的字段,我可以使用数组函数来知道每个字段的名称,并加快我的应用程序。
但是在MySQL 5.6中,我怎么能只选择有值的字段呢?
类似:
SELECT * FROM mytable ONLY fields_not_null();
该表记录一天中每分钟发生的事件数。记录集基本上是:
- 一个日期字段
- 60x24字段,以分钟为单位(1440字段)
将其更改为24个表(每小时)会降低性能,并且每个表中仍然有数十个空字段。
将其更改为一个带有date_time和boolean的记录集是性能最差的情况。
您可以尝试使用col IS NOT NULL
: SELECT * FROM mytable WHERE column IS NOT NULL
对我来说,这表明你的MySQL数据库没有正确构建。
在PHP中最简单的方法是使用array_filter。例如:array_filter($row)
将去掉所有空值(大致相当于false)。如果你只想摆脱null和空值,但留下0,那么你可以使用不同的回调,例如strlen,它将只返回至少有一个字符的值:
$filteredRow = array_filter($row, 'strlen');
现在$filteredRow将包含所有在field=>value数组中有值的字段。如果只想要字段名,可以使用array_keys:
$fields = array_keys($filteredRows);
在不知道您将如何处理这些数据的情况下,我无法指出一个单一的解决方案。这里有几个:
方案A:让应用程序代码处理所有的null
方案B:每非null分钟有一行。您可能需要使用GROUP_CONCAT()
函数。
方案C:使用COALESCE()
和/或IFNULL()
功能
方案D:将非null值存储在关联数组(minute->value)中,序列化成JSON字符串,将JSON存储在TEXT
字段中
不要使用24个表
不要尝试在一个表中有1440列;