首页 > 代码库 > MYSQL操作
MYSQL操作
1、下面的测试案例表明mysql的更新操作(update和delete会加间隙锁)
所以当数据库的更新操作很频繁时,间隙所很影响性能,如果业务允许的话,建议调整数据库的事物级别,或者关掉间隙锁。
1 start transaction; start transaction; 2 3 delete from test; 4 5 insert into test values(2‘namw2‘);(锁超时,因为左边的delete加了间隙所) 6 commit; commit;
分析:数据库的读分为当前读和快照读,数据库的更新操作(delete、update、insert)都是当前读,在执行过程中都会加锁。
3、表的列包含unique属性
mysql会对unique列建索引,而且unique列不能太大,建表的时候就有要求。
在对数据更新操作(insert、update)时,执行消耗主要包含两方面:一方面会在unique索引上查找本次更新的数据是否unique;另一方面多个请求同时更新,为了保证unique,可能会存在加锁。
详见《MySql的unique实现原理简析》
4、大事务
因为一次事务里可能会包含加锁操作,所以如果一个事务过大,那么事务所拥有锁的时间就很长,那么就会造成别的事务等待锁超时,此时会严重降低数据库的吞吐率。比如上面的3里面的unique属性,如果一次更新太多数据,而这些更新又需要采取一定的
同步保证unique,那么如果不同的事务存在更新后的数据不是unique的,那么有的事务就会等待锁(等待冲突的那个事务提交),如果此时事务很大,就会引起锁超时。
5、MYSQL的游标采取临时表的形式,在open cs的时候会读取所有的游标选取的数据到临时表里面。一般临时表为内存临时表,如果存在下面两种情况则不得不使用磁盘临时表:
1、如果表的大小超过tmp_table_size的时候会在磁盘上创建临时表。
create table encrypt_mapping( id int auto_increment primary key, original_value varchar(200), encr_value varchar(200), type int,
unique key or_type_uniIndex (original_value,type)
);
事务1:insert ignore into encrypt_mapping select XXX from XXX;
事务2:insert ignore into encrypt_mapping select XXX from XXX;
此时因为encrypt_mapping里面的unique key,如果事务1先执行,事务2再执行因为两个大事务之间存在unique冲突的情况会出现锁超时的现象。
7、truncate table 比delete 快很多,因为delete需要根据where条件查找到数据再删除,delete的执行过程需要走索引和加锁等操作。而truncate只是删除整个表,所以会快很多。
8、ALTER TABLE 的语法
删除列:ALTER TABLE XXX DROP COLUMN XXX; 增加列:ALTER TABLE ADD COLUMN XXX; 修改列:ALTER TABLE MODIFY COLUMN XXX;
MYSQL操作