首页 > 代码库 > MYSQL操作

MYSQL操作

1、下面的测试案例表明mysql的更新操作(update和delete会加间隙锁)

  所以当数据库的更新操作很频繁时,间隙所很影响性能,如果业务允许的话,建议调整数据库的事物级别,或者关掉间隙锁。

1 start transaction;                            start transaction;
2 
3 delete from  test;                                   
4 
5                                                insert into test values(2namw2);(锁超时,因为左边的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的时候会在磁盘上创建临时表。

       2、游标的内存临时表不支持text或者blob数据的存储,如果游标选取的列含有text或者blob的时候,mysql会在磁盘上存储这些数据。
6、
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操作