Java SQL扩展:当有多个或多个列条件时,我应该尽量减少查询吗?
我的数据库模式是Java SQL扩展:当有多个或多个列条件时,我应该尽量减少查询吗?,java,mysql,database,performance,scalability,Java,Mysql,Database,Performance,Scalability,我的数据库模式是 INTEGER id TIME_STAMP last_updated // indexed VARCHAR url // indexed // Place attributes VARCHAR name // indexed VARCHAR address // indexed VARCHAR phone // indexed INTEGER score 在“姓名”、“地
INTEGER id
TIME_STAMP last_updated // indexed
VARCHAR url // indexed
// Place attributes
VARCHAR name // indexed
VARCHAR address // indexed
VARCHAR phone // indexed
INTEGER score
在“姓名”、“地址”和“电话”字段中,其中一个字段必须为非空,另外两个字段必须为空
有效例子:
{name="Pizza Hut", address=null, phone=null, score=40}
{name="Pizza Hut", address="some address", phone=null, score=40}
无效示例:
{name="Pizza Hut", address=null, phone=null, score=40}
{name="Pizza Hut", address="some address", phone=null, score=40}
我正在尝试编写这个函数
// return a map/dictionary of String keys and Integer scores of latest data in DB that matches given url, and is not older than last_updated.
// example: {name=40, address=50, phone=66}
public Map getPlaceAnalysis(String name_, String address_, String phone_, String url, DateTime last_updated_);
缩放假设:
- 此函数将被频繁调用
- DB有数百万行
- 姓名、电话、地址可能不是我的唯一字段。我可能对一个地方有20多个属性
SELECT score FROM db_name WHERE name=name_ AND url = url_ AND last_updated > last_updated_
SELECT score FROM db_name WHERE phone=phone_ AND url = url_ AND last_updated > last_updated_
SELECT score FROM db_name WHERE address=address_ AND url = url_ AND last_updated > last_updated_
每次查询后,我可以选择最新的一行,并将分数写入我的地图/字典中,以返回相应的键SELECT name, phone, address, score FROM db_name WHERE (name=name_ OR phone=phone_ OR address=address_ ) AND url = url_ AND last_updated > last_updated_
然后,我循环查询结果,找出姓名、电话和地址的最新行,并返回相应的地图/字典我采取哪种方法重要吗?我猜第二个更好,但我对数据库几乎没有经验。对不起,如果有任何解释不清楚。我想这是一个非常常见的问题,但我不知道如何搜索这个问题。当运行对远程数据库的查询时,在建立连接和类似的东西上花费了大量时间,这些与数据库的通信有关,而与查询本身无关。从这个角度来看,您希望最小化向数据库发出的查询数量 正如MYSQL参考手册中所解释的,在查询中使用的三个字段上创建复合索引似乎对您有利。当您仅搜索
名称
、名称
和地址
以及所有三个字段时,也会使用此索引(请参见它对最左侧前缀的说明),因此请注意您要声明索引的顺序
如果可以在您的案例中使用,那么这三个字段的哈希的想法似乎也很有趣
最后,您应该阅读和/或让数据库管理员来帮助您
在讨论查询性能时,要理解的关键是设计一个可重复的测试用例(即使用相同的数据集、可重复的数据库负载等),然后尝试不同的方法。并始终注意测试环境和生产环境之间的差异
我希望这有帮助