将查询组合为一个查询以进行优化

时间:2014-10-02 08:55:39

标签: mysql optimization

我编写了以下查询,我在更新两个表但在三个不同的查询中执行此操作

查询条件如下:

检查表格中的空座位是否反对" user_id"并更新" user_id"设置座位

UPDATE seats SET user_id = '101', modified = NOW() WHERE  book_id ='123' AND user_id = '0' LIMIT 1

设置seat后,更新book表以更新book id的时间

UPDATE books SET end_time = '$end_time', modified = NOW() WHERE  id ='123';

再次更新seats表,将registered列更新为1,seat表中book_id

UPDATE seats SET registered = '1', modified = NOW() WHERE  book_id ='123';

我可以将它们写成一个优化查询吗?

1 个答案:

答案 0 :(得分:1)

您可以加入这些表并在一个语句中执行所有更新,但如果您确实只想更新一行,则不能。正如您在manual中看到的那样,只有单表语法支持LIMIT

Single-table syntax:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

Multiple-table syntax:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]

如果您想在一个语句中组合这些查询,因为您担心竞争条件,请查看事务。这样做:

START TRANSACTION;
UPDATE seats SET user_id = '101', modified = NOW() WHERE  book_id ='123' AND user_id = '0' LIMIT 1;
UPDATE books SET end_time = '$end_time', modified = NOW() WHERE  id ='123';
UPDATE seats SET registered = '1', modified = NOW() WHERE  book_id ='123';
COMMIT;

这可确保此块中的所有语句成功或无成功。如果最后一个失败,那么前一个会失败。他们被视为一个陈述,阅读更多关于这个here。先决条件是,您使用能够进行交易的存储引擎,例如InnoDB。还要确保使用适当的isolation level