update是行锁还是表锁
创建一个简单表如下
1
2
3
4
5
6CREATE 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;在表中插入数据如下
1
2INSERT INTO `t` VALUES (1, '张三', 10);
INSERT INTO `t` VALUES (2, '李四', 20);更新数据
只执行commit以上的语句1
2
3
4
5set @@autocommit= 0;
SELECT @@autocommit;
UPDATE t SET name = '黎明3' WHERE `age` = 20;
COMMIT;再更像另一条数据
1
UPDATE `t` SET `name` = `黎明1` WHERE `age` = 10;
- 第三条更新数据执行commit后 最后的更新数据才进行了更新
- 发现在不执行commit情况下 该更新会阻塞,说明update当前是表锁
- 给age加上索引在此之行3-4步骤,发现update不会阻塞
1
ALTER TABLE `t` ADD INDEX `idx_age` (`age`);
结论
update是行锁还是表锁,不能单方面说是与否,
在查询未加索引的情况下,update是表锁。
在查询加了索引的情况下,update是行锁。
额外注释
索引优化
索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。
反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。
可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引;
因此,索引越多,插入、更新和删除记录的速度就越慢。
对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。
OFFSET
在MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15。
使用LIMIT