查询数据库的属性、包括引擎
show table status from we7;
查询数据库的表引擎
show ENGINES;
插入一百万条数据的对比:
InnoDB,每秒插入1000条数据左右没有时候会在600,一共15分钟
MYISAM,每秒能插入16万数据,一共用了27秒
mysql和myisam表都能支持表级锁
表级锁
//如果是读级别锁 在当前会话事务未提交的时候,其他会话可读不可写
lock table user_balance read;(读级别)
//如果是写级别锁 在当前会员事务未提交的时候,其他会话不可读也不可写
lock table user_balance write;(写级别)
行级锁只能innodb支持,也是mysql中的最小粒度梭们也是真正的事务锁。
行级锁
行级锁分为共享锁和排它锁。
共享锁 lock in share mode
select xx LOCK IN SHARE MODE
这样就打开了共享锁,凡是select取出来的行数据 只有该回话才可以修改,直到commit过后,其他的会话才能修改,但是过程当中其他会话可以读。
start transaction;
select * from user_balance where user_id=3 lock in share mode;
commit;
update user_balance set user_money = 10 where user_id=3;
行锁是索引级别的,不是记录级别的。(上面两条命令执行,如果user_id并非索引,那么该锁会自动转换为表级别锁)
导致:
update user_balance set user_money = 10 where user_id=4;
也无法执行。
start transaction;
//id为索引,正确锁住 实现行级锁索引级别
select * from user_balance where id=3 lock in share mode;
commit;
//依然不能修改 因为user_id不是索引
update user_balance set user_money = 10 where user_id=3;
//可以修改 因为id是索引
update user_balance set user_money = 10 where id=3;
排他锁 for update
打开了排他锁,其他会话依然不能改数据,但是可以普通的的读。如果另外一个会话也想加锁则会产生冲突。
start transaction;
//id为索引,正确锁住 实现行级锁索引级别
select * from user_balance where id=27 for update;
commit;
//可以正常查询
select * from user_balance where id=27;
//不能运行 因为被锁了
update user_balance set user_money = 100 where id=27;
排它锁是在给加锁的记录再次加锁的时候,就会出问题
//读都读不出来,需要上一个锁事务提交以后 才可以再次加锁
select * from user_balance where id=27 for update;