MYSQL 更新内连接性能

MYSQL update with inner join performance

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

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

订单商品table

order_item_id
order_id
quantity
unit_price
shipping_price
business_id
workflow_id
delivery_id
item_id

订单table

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`)

)

谈理论

在执行连接之前您应该拥有最少的数据集,因此实际上只会对您需要的数据执行连接,即使使用内部更新是一个特殊的 select 和 "write this data on the select"

在实践中说话

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

那又怎样

我会尝试让 table 尽可能的纤细,但不要太疯狂,我在 aws db2.micro 机器上执行了大约 100k 行的更新查询,它花了大约 4秒,所以在我看来,试试看你是否得到了你需要的真实结果。

tl;dr 试试看速度有没有提升