连接是在这两个表的主键列上完成的。
我怀疑是否应该在更新之前触发选择查询,或者该查询是否是一个不错的选择?(就性能而言)
订单项目表
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/