update是行锁还是表锁

  1. 创建一个简单表如下

    1
    2
    3
    4
    5
    6
    CREATE TABLE `t` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(20) DEFAULT NULL,
    `age` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  2. 在表中插入数据如下

    1
    2
    INSERT INTO `t` VALUES (1, '张三', 10);
    INSERT INTO `t` VALUES (2, '李四', 20);
  3. 更新数据
    只执行commit以上的语句

    1
    2
    3
    4
    5
    set @@autocommit= 0;
    SELECT @@autocommit;
    UPDATE t SET name = '黎明3' WHERE `age` = 20;

    COMMIT;
  4. 再更像另一条数据

    1
    UPDATE `t` SET `name` = `黎明1` WHERE `age` = 10;
  • 第三条更新数据执行commit后 最后的更新数据才进行了更新
  • 发现在不执行commit情况下 该更新会阻塞,说明update当前是表锁
  1. 给age加上索引
    1
    ALTER TABLE `t` ADD INDEX `idx_age` (`age`);
    在此之行3-4步骤,发现update不会阻塞

结论
update是行锁还是表锁,不能单方面说是与否,
在查询未加索引的情况下,update是表锁。
在查询加了索引的情况下,update是行锁。

额外注释

set @@autocommit= 0; 在sql什么意思?
这条 SQL 语句”set @@autocommit = 0;” 是用来控制数据库的自动提交功能。

默认情况下,当你执行 SQL 语句时,数据库会自动将每一条语句作为一个事务并立即提交(Autocommit)。这意味着每个 SQL 语句执行后都将被认为是一个独立的操作,不管之前是否有其他操作。

然而,通过将 “@@autocommit” 的值设置为 0,你告诉数据库不要自动提交事务。这样的话,你需要使用事务控制语句(如 BEGIN、COMMIT、ROLLBACK)来显式地开始、提交或回滚事务。

使用这个语句的主要目的是为了在一个连续的 SQL 操作序列中保持一致性,以便你可以在逻辑上分组多个操作,并根据需要提交或回滚整个事务。

SELECT @@autocommit; 在sql什么意思?

SELECT @@autocommit 是一个 SQL 查询语句,它用于获取当前数据库连接的自动提交模式的状态。@@autocommit 是一个全局变量,它表示是否启用了自动提交模式。

当 @@autocommit 的返回值为 1 时,表示自动提交已启用,即每个单独的 SQL 语句都将被立即提交到数据库。当 @@autocommit 的返回值为 0 时,表示自动提交已禁用,必须使用 COMMIT 命令显式地提交更改。

所以 SELECT @@autocommit 语句的结果将告诉你当前数据库连接的自动提交模式是否启用。

索引优化

索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。
反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。

可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引;
因此,索引越多,插入、更新和删除记录的速度就越慢。

对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

OFFSET

在MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15。
使用LIMIT OFFSET 分页时,随着N越来越大,查询效率也会越来越低。

avatar
懒觉猫先生
欢迎你们的到来!
关注我吧
最新文章
最新评论
正在加载中...
网站资讯
文章数目 :
175
已运行时间 :
本站总字数 :
118.7k
本站访客数 :
本站总访问量 :
最后更新时间 :