1、 组合索引,组合索引为什么要最左匹配原则
组合索引,是在按一定顺序的多个字段上创建的索引。多个字段的排序不同,索引的使用不同。即 index_name (a, b)和 index_name2 (b, a)是不同的索引。
组合唯一索引也遵循组合索引的使用规则。
组合索引的使用规则-最佳左匹配规则
mysql创建复合索引的规则是首先对复合索引的最左边,也就是第一个索引数据进行排序,在第一个字段排序的基础上,再对第二个索引字段进行排序。其实就是实现了类似于order by 字段一 再 order by 字段二,这样一种排序规则。那么所以第一个字段是绝对有序的,而第二个字段就是无需的了。因此通常情况下使用第二个字段进行条件判断,就用不到索引了。这也就是mysql为什么会强调 联合索引最左匹配原则的原因。
———————————————— 原文链接:blog.csdn.net/myloverxx/a…
2、 数据库的事务,数据库的锁有哪些?
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。
3、 数据库不设置主键ID会有行锁吗?
主键无论有无索引,上锁都是上行锁;
非主键有索引上锁上的是行锁,无索引上的是表锁。
InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。
4、 sychroized和lock锁的区别
8大区别;
区别1:Synchronized 是Java的一个关键字,而Lock是java.util.concurrent.Locks 包下的一个接口;
区别2:Synchronized 使用过后,会自动释放锁,而Lock需要手动上锁、手动释放锁。(在 finally 块中)
区别3:Lock提供了更多的实现方法,而且可响应中断、可定时,而synchronized 关键字不能响应中断;
区别4:synchronized关键字是非公平锁,即,不能保证等待锁的那些线程们的顺序,而Lock的子类ReentrantLock默认是非公平锁,但是可通过一个布尔参数的构造方法实例化出一个公平锁;
区别5:synchronized无法判断,是否已经获取到锁,而Lock通过tryLock()方法可以判断,是否已获取到锁;
区别6:Lock可以通过分别定义读写锁提高多个线程读操作的效率。
区别7:二者的底层实现不一样:synchronized是同步阻塞,采用的是悲观并发策略;Lock是同步非阻塞,采用的是乐观并发策略(底层基于volatile关键字和CAS算法实现)。
区别8:在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时 Lock 的性能要远远优于 synchronized。所以说,在具体使用时要根据适当情况选择。