具有内部联接性能的MYSQL更新

时间:2015-08-09 10:25:22

标签: 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 = ? 

更新:添加show create table 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`)

1 个答案:

答案 0 :(得分:0)

在理论上讲话

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

在实践中说话

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

那是什么

我会尽量让桌子尽可能地瘦,但不要太疯狂,我在aws db2.micro机器上执行了类似100k行的更新查询,它花了4秒钟,所以在我看来,试试看看你是否得到了你需要的真实结果。

tl; dr 只是尝试查看速度是否增加