java - MYSQL 更新内连接性能

标签 java mysql performance inner-join

连接是在这两个表的主键列上完成的。

我怀疑是否应该在更新之前触发选择查询,或者该查询是否是一个不错的选择?(就性能而言)

订单项目表

order_item_id
order_id
quantity
unit_price
shipping_price
business_id
workflow_id
delivery_id
item_id

订单表

billing_address_id
shipping_address_id
payment_mode
total_price
shipping_price
customer_id 
order_id

以下是我从 Java 服务(使用 jdbc)发出的查询:

UPDATE order_items t1 
 INNER 
  JOIN Orders t2 
    ON t2.order_id = t1.order_id 
   SET t1.workflow_id = ? 
 WHERE  t1.order_item_id = ? 
   and t2.order_id = ? 
   and t2.customer_id = ? 
   and t1.delivery_id = ? 

更新:添加显示创建表 order_items

'CREATE TABLE `order_items` (
`order_item_id` int(20) NOT NULL AUTO_INCREMENT,
`quantity` int(10) unsigned NOT NULL,
`unit_price` int(10) unsigned NOT NULL,
`shipping_price` int(10) unsigned NOT NULL,
`pickup_date` datetime DEFAULT NULL,
`create_TS` datetime DEFAULT CURRENT_TIMESTAMP,
`update_TS` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`business_id` int(10) NOT NULL,
`order_id` int(11) NOT NULL,
`item_id` int(10) unsigned NOT NULL,
`delivery_id` int(11) NOT NULL,
`workflow_id` int(11) DEFAULT NULL,
 PRIMARY KEY (`order_item_id`),
 KEY `fk_business_id` (`business_id`),
 KEY `fk_order_id` (`order_id`),
 KEY `fk_item_id` (`item_id`),
 KEY `fk_delivery_id` (`delivery_id`),
 CONSTRAINT `fk_business_id` FOREIGN KEY (`business_id`) REFERENCES `business` (`MID`),
 CONSTRAINT `fk_delivery_id` FOREIGN KEY (`delivery_id`) REFERENCES `delivery_mode` (`delivery_id`),
 CONSTRAINT `fk_item_id` FOREIGN KEY (`item_id`) REFERENCES `item_business` (`item_id`),
CONSTRAINT `fk_order_id` FOREIGN KEY (`order_id`) REFERENCES `Orders` (`order_id`)

)

最佳答案

从理论上讲

在执行联接之前,您应该拥有最小的数据集,因此联接实际上只会对您需要的数据执行,即使是内部更新也是如此一个特殊的选择并“在选择上写入此数据”

实践中说话

任何 dbms 的工作之一就是使用数据库代数和其他东西执行积极级别的优化,因此大多数时候,您花在优化查询上的时间实际上是徒劳的,因为您的 dbms 将执行相同级别的优化优化

那又怎样

我会尝试让表尽可能最小,但又不会太疯狂,我在 aws db2.micro 机器上执行了大约 100k 行的更新查询,花了大约 4 秒,所以在我看来,尝试一下看看您是否得到了您需要的真正结果。

tl;dr 尝试看看速度是否会提高

关于java - MYSQL 更新内连接性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31903203/

相关文章:

php - 用 + 增加一个计数器并将值存储到数据库

mysql group by 不返回正确的对应行

java - 比较二进制数据和逐行字符串哪个更快?

c# - 分析为什么 WCF 比 WSE webservice 慢很多

java - 使用 Java 的 KeyListener 与多个文本字段交互

java - 如何更改 Java Transformer 中的默认日志记录

mysql - 检查是否存在。如果存在则不插入数据,如果不存在则插入数据

mysql - 缓存非常慢的查询的结果集

java - Android 必须有 id 为的 Expandableview

java - Grails 应用程序中的类加载器内存泄漏