Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQL扩展:当有多个或多个列条件时,我应该尽量减少查询吗?_Java_Mysql_Database_Performance_Scalability - Fatal编程技术网

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多个属性
有两种方法:

  • 3(或数据库中存储的位置的属性数)查询:

    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_
    
    每次查询后,我可以选择最新的一行,并将分数写入我的地图/字典中,以返回相应的键

  • 1查询:

    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参考手册中所解释的,在查询中使用的三个字段上创建复合索引似乎对您有利。当您仅搜索
    名称
    名称
    地址
    以及所有三个字段时,也会使用此索引(请参见它对最左侧前缀的说明),因此请注意您要声明索引的顺序

    如果可以在您的案例中使用,那么这三个字段的哈希的想法似乎也很有趣

    最后,您应该阅读和/或让数据库管理员来帮助您

    在讨论查询性能时,要理解的关键是设计一个可重复的测试用例(即使用相同的数据集、可重复的数据库负载等),然后尝试不同的方法。并始终注意测试环境和生产环境之间的差异

    我希望这有帮助