java - SQL 缩放 : should I try to minimize queries when having multiple OR column conditions?

标签 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

姓名、地址和电话字段中,其中之一必须非空,另外两个必须为空。

有效示例:

{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_);

缩放假设:

  • 此函数将被频繁调用。
  • 数据库有数百万行
  • 姓名、电话、地址可能不是我唯一的字段。我可能有 20 多个关于某个地点的属性。

有两种方法:

  1. 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_
    

    每次查询后,我可以选择最新的行并将分数写入我的 map /字典中,以便为适当的键返回。

  2. 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_
    

    然后,我循环遍历查询结果,找出最新更新的姓名、电话和地址行,并返回相应的 map /字典。

我采取哪种方法重要吗?我猜第二个更好,但我对数据库的经验很少。抱歉,如果有任何解释不清楚。我想这是一个非常常见的问题,但不知道如何搜索这个问题。

最佳答案

当对远程数据库运行查询时,会花费大量时间来建立连接和类似的事情,这些时间与数据库的通信更相关,而不是与查询本身相关。从这个角度来看,您希望最大限度地减少向数据库发出的查询数量。

如 MYSQL 引用手册中所述 Multiple-Column Indexes ,似乎对您在查询中使用的三个字段创建复合索引会对您有利。当您仅搜索 namenameaddress 以及所有三个字段时,也会使用此索引(请参阅最左边的内容)前缀),因此请注意声明索引的顺序。

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

最后你应该阅读 Understanding the Query Execution Plan和/或让数据库管理员来帮助您。

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

希望对您有所帮助。

关于java - SQL 缩放 : should I try to minimize queries when having multiple OR column conditions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18259504/

相关文章:

php - 如何显示数据库中的 BLOB 图像?

database - 同步时模型不会创建表

Java mysql - SELECT 语句延迟主线程

php - 如何每15秒检查和更改mysql中的数据?

java - 我们应该在 Java Eclipse Dynamic Web 项目中的哪里存储数据库配置文件?

java - Tomcat 没有上传所有文件

mysql - 获取名称在列中的顺序

java - 通过将对象的属性/属性与字符串进行比较来检查对象列表是否已存在

java - 使用 SSHJ 连接到 Google Compute Engine 实例

java - 从 Google Cloud Storage 获取存档版本