1.索引相当于目录,有单列索引,组合索引。。。也占内存,可以提高查询效率但是会降低增删改效率。
语句:CREATE index name on table(clounm(length))
2.
全局锁:锁的是整个database。由MySQL的SQL layer层实现的 -
表级锁:锁的是某个table。由MySQL的SQL layer层实现的 -
行级锁:锁的是某行数据,也可能锁定行之间的间隙。由某些存储引擎实现,⽐如InnoDB
按照锁的功能来说分为:共享读锁和排他写锁。 按照锁的实现⽅式分为:悲观锁和乐观锁(使⽤某⼀版本列或者唯⼀列进⾏逻辑控制)
乐观锁:他是相对于悲观锁而言,认为数据库并发没那么高,通过程序(递归和版本号判断)控制,发现不对就会提交不成功,重新拿数据,对更改有点东西,但是不控制读取,万一碰上了冲突,来回查,效率低。
悲观锁:悲观锁要给数据库上锁啦,表级锁和行级锁,
表级锁有表锁(手动)和元数据锁(自动),
表锁有两个形式:手动加,共享读、独占写,
锁类型 | 自己可读 | 自己可写 | 他人可读 | 他人可写 | |
读锁 | 是 | 是 | 否 | ||
写锁 | 是 | 否 | 否 |
共享读:读锁,锁的表,大家也能读,但是不能写,等着解开才行
独占写:写锁,锁住表,大家查都不能查,得等他写完了开锁
lock tables t1 read,t2 write;
这个语句有两个含义:
- 对其他线程来说,t1表,可以读,不可以写;t2表,读写都不可以
- 对本线程来说,t1表只能读,t2表只能读写
元数据锁(MDL),自动加,保证读写正确性,他也有读锁和写锁
DML(select、update、insert、delete)、DDL(create、alter、drop)语句时都会申请MDL锁,读读共享,读写互斥,写写互斥
应该1.设置参数lock_wait_timeout为较小值,使被阻塞端主动停止。2.DDL操作及备份操作放在业务低峰期执行。 3.少用工具开启事务进行查询,图形化工具要及时关闭 4.规范使用事务,及时提交事务,避免使用大事务。
行锁
当我们对一行进行更新但是不提交的时候,其他进程也对该行进行更新则需要进行等待,这就是行锁
如果我们对一行进行更新,其他进程更新别的行是不会受影响的
当我们的行锁涉及到索引失效的时候,会触发表锁的行为
共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁
共享锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。