Php 多过滤器的MySQL实时实现

Php 多过滤器的MySQL实时实现,php,mysql,optimization,filtering,cube,Php,Mysql,Optimization,Filtering,Cube,我正在为房地产门户开发一个PHP应用程序,我有一个带有属性表的MySQL数据库。此表包含约500000行和约20列属性要素。假设每个特征都是一个整数 功能示例: 公寓房间数(1-10) 建筑物类型(1-20) 建筑物状况(1-10) 我需要实现一个带有多过滤器实时导航面板的网页。其思想是,用户可以选择几个特性,使其与特定值相等。 例如:1-2个房间(“1”、“2”),建筑为196x(“6”),状态为一般、良好或优秀(“3”、“4”、“5”),尤其是在某个城市 关键要求是用户能够看到每个特征过

我正在为房地产门户开发一个PHP应用程序,我有一个带有属性表的MySQL数据库。此表包含约500000行和约20列属性要素。假设每个特征都是一个整数

功能示例:

  • 公寓房间数(1-10)
  • 建筑物类型(1-20)
  • 建筑物状况(1-10)
我需要实现一个带有多过滤器实时导航面板的网页。其思想是,用户可以选择几个特性,使其与特定值相等。 例如:1-2个房间(“1”、“2”),建筑为196x(“6”),状态为一般、良好或优秀(“3”、“4”、“5”),尤其是在某个城市

关键要求是用户能够看到每个特征过滤器附近匹配属性的数量,同时考虑到当前选定的过滤器

下面是它的外观示例:

Rooms: 1[X], 2[X], 3[ ] (15000 more), 4[ ] (10000 more)
State: bad[ ] (1000 more), average[X], excellent[X]
Year: 1950[ ] (19000), 1960[ ] (20000), 1970[ ] (18000)
City: A[ ] (25000), B[ ] (18000), C[ ] (30000)
Price: <100000[ ] (20000), >100000[ ] (30000)

然而,一组这些查询需要几秒钟的时间,我需要它实时工作,也就是说,不是所有的问题都可以在数据库中解决

您必须查看所有500K行。任何索引都不太可能在可能的查询中提供超过一小部分的帮助。所以我建议您将整个数据保存在RAM中,并进行一些快速处理(例如C++),以运行所有这些数据

数据应该是(在MySQL术语中)
TINYINT UNSIGNED
类似于
charunsigned
。可能数据可以存储在20个字节中,每个功能一个字节?只有10MB的C++,MySQL上的30到100MB,PHP中的400兆字节。MySQL可以将数据存储在
BINARY(20)
中,以简化获取过程,但代价是插入/更新

使用MySQL作为“真相的来源”,并定期将其加载到处理引擎中(建议使用1分钟和Node.js)。然后专注于优化计数


现在大多数语言都是“解释性的”,因此会产生一定的开销。C或C++是在机器级运行的少数几个。我很确定他们可以在200毫秒内完成10米的计算;我怀疑是否有解释性语言可以。

考虑预计算和/或重缓存。可能不需要每次点击实时数据库都实际运行此查询;稍微过时的缓存/预计算副本可能就足够了。除此之外,一切都是可转位的;要么使用MySQL索引,要么只为特定的过滤器组合及其可能的计数构造特殊的索引(在这种情况下,MySQL中没有)。我要避免的一件事是,您需要构造一个与所选过滤器匹配的
WHERE
子句;将数据进一步分离,您将获得许多选项。缓存或预计算的问题是,有太多的20个现有要素列的组合,每个都有大约10个不同的值:10^20。我们需要一个TTL约为1分钟的实时解决方案。TTL为1分钟?一分钟内会出现多少新的或更改的列表?我怀疑1小时就足够了。好吧,1分钟的关注点是当用户向数据库提交他/她的财产广告时的用例,并且希望能够使用过滤器找到它,以确保其他人可以发现它。谢谢,看起来这是可以接受的解决方案!我认为我们将继续使用C++和RAM数据库。你会推荐任何一个好的/现代的C++框架来实现多线程服务器,它可以定期更新MySQL数据,同时回答API请求吗?Boost Asio怎么样?考虑有2个进程用一对共享内存段(DB)运行。重新加载程序将新数据加载到一个段中,然后向另一个发送切换到该段的信号(通过更改它使用的全局指针)。
Rooms: 1[X], 2[X], 3[ ] (5000 more), 4[ ] (5000 more)
State: bad (1000 more), average[X], excellent[X]
Year: 1950 (19000), 1960 (20000), 1970 (18000)
City: A[X], B (+4000), C (+3000)
Price: <100000 (5000), >100000 (6000)
SELECT FeatureX, COUNT(*) AS num FROM properties WHERE selectedFeature1=Val1 AND selectedFeature2=Val2 ... AND selectedFeatureN=ValN GROUP BY featureX;