在理解事务的隔离级别之前,首先需要明白,为什么需要隔离级别?没有事务的隔离,在事务并发访问的时候会出现如下三种问题:脏读、不可重复读、幻读。
package cn.fortune.Mysql;
/*
* @author lixiang
* @E-mail: [email protected]
* @date 2019-03-24
* @blog: threeyears.cn
*/
public class MysqlDome1 {
public static void main(String[] args) {
//事务并发(以A、B事务为例)可能产生的问题
String str ="脏读";
switch (str){
case "脏读":
System.out.println("A事务读取到B事务修改但未提交的数据," +
"此时事务B回滚,A就读到了脏数据");
case "不可重复读":
System.out.println("A事务重复读取同一数据时,此时B事务对此数据进行了修改," +
"导致A事务在多次数据中读取同一数据时,结果发生改变");
case "幻读":
System.out.println("顾名思义、即事务A多次对表中所有的行,都进行了修改," +
"此时事务B新增了一条数据,事务A发现还有数据没有被修改");
}
System.out.println("总结:脏读--->读取到事务未提交的数据;不可重复读读取到已提交");
System.out.println("不可重复读侧重于修改,解决方法使用行锁");
System.out.println("幻读侧重于新增或者删除,解决方案使用表锁");
}
}
引出隔离级别:
mysql默认级别是可重复读,那就意味着可能出现幻读问题。
2.MySql数据库在什么情况下出现死锁?产生死锁的四个必要条件?如何解决死锁?
package cn.fortune.Mysql;
/*
* @author lixiang
* @E-mail: [email protected]
* @date 2019-03-24
* @blog: threeyears.cn
*/
public class MysqlDome2 {
public static void main(String[] args) {
//MySql数据库在什么情况下出现死锁?产生死锁的四个必要条件?如何解决死锁?
String str ="死锁";
System.out.println("含义是:两个及两个以上的事务,因争夺资源而造成相互等待的的现象");
Boolean b = new Boolean(str);
if (b) {
//其四个必要条件为:
System.out.println("互斥条件:一个获取到资源,另外一个等待");
System.out.println("请求与保持条件:一个请求对象在请求新资源的时候,保持对当前资源的不释放");
System.out.println("不剥夺条件:如果一个资源请求对象不能够强力剥夺另外一个资源占有对象");
System.out.println("环路等待条件:比如A占有B等待的资源,B占有A等待的资源");
}
//how
System.out.println("方式一:设置超时");
System.out.println("方式二:加锁顺序保持一致");
}
}
3.覆盖索引是什么?
索引覆盖是指:如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据(回行:去磁盘查找。如果就在索引上找,而且索引还在内存中很快)。(查索引是快的,回行是慢的)。这种查询速度非常快,称为”索引覆盖”。比如我在要员工表上,查询名字为lixiang的信息,则 select username, age, hometown from employee where username ="lixiang"
如果我事先在username上建立索引,那么则就是覆盖索引。
索引就是一种数据结构。
4.MySQL中JOIN和UNION什么区别?
package cn.fortune.Mysql;
/*
* @author lixiang
* @E-mail: [email protected]
* @date 2019-03-24
* @blog: threeyears.cn
*/
public class MysqlDome3 {
public static void main(String[] args) {
//MySQL中JOIN和UNION什么区别?
System.out.println("UNION操作符用来合并两个及以上的select语句的结果集");
System.out.println("并且,列的顺序、类型、数量都相同,union过滤重复的值,union不会");
System.out.println("------------------");
System.out.println("Join操作符则是连接两张及以上的表,没有其他的要求。");
}
}
5.数据库三范式是什么?
package cn.fortune.Mysql;
public class ExampleDemo {
public static void main(String[] args) {
/*
关系型表的三范式:
if(每列都具有原子性不可拆分){
//实例: 网申的时候: 填地址的时候都是 先省份+地级市---》这里就有拆分
//(没有直接让你填湖南株洲)
sout("满足第一范式,从列出来");
if(表中每行数据具有唯一性){
sout("表中的所有列,都必须依赖于主键:还是需要和列相关"):
//填网申简历的时候,会分为实习经历、校园获奖,其实每段对应一个表
if(表中的列都与主键直接相关而不是间接相关){
sout("");
}
}
}
*/
}
}
6. Mysql的执行流程
package cn.fortune.Mysql;
public class MysqlTest {
public static void main(String[] args) {
/*
mysql执行流程(伪代码):
1)客户端发送sql语句到mysql服务器
2)服务器需要进行权限检查
if(true){
权限检查通过;
if(命中查询缓存){
直接返回结果给客户端
}else{
mysql进行sql解析、预处理
优化器对进行优化
生成对应的执行计划
执行对应的计划
将查询结果返回给客户端
}
}
*/
}
}
7.WHERE和HAVING的区别?
package cn.fortune.Mysql;
/*
* @author lixiang
* @E-mail: [email protected]
* @date 2019-03-24
* @blog: threeyears.cn
*/
public class MysqlDome4 {
public static void main(String[] args) {
//7.WHERE和HAVING的区别?
System.out.println("都是用来过滤的");
System.out.println("where分组前对数据过滤,所以是行过滤,不能接聚合函数");
System.out.println("having分组后对数据过滤,即多行过滤,可以接聚合函数");
}
}
8.现在发现sql查询很慢,如何分析哪里出了问题,应该如何优化??
package cn.fortune.Mysql;
/*
* @author lixiang
* @E-mail: [email protected]
* @date 2019-03-24
* @blog: threeyears.cn
*/
public class MysqlDome5 {
public static void main(String[] args) {
//8.现在发现sql查询很慢,如何分析哪里出了问题,应该如何优化??
String string = "sql查询很慢";
Boolean b = new Boolean(string);
if(b){
System.out.println("先开启慢查询,定位到耗时比较久的语句");
System.out.println("再使用explain具体分析sql语句," +
"是否用到了全表扫描、是否是没有使用到索引、是否索引没有被命中,当然也有可能是网络问题");
System.out.println("优化手段============");
System.out.println("a.为相关列建立索引,索引就是一种数据结构" +"b优化sql语句的编写");
}
}
}
9.哪些情况需要建立索引哪些情况下需要索引?
package cn.fortune.Mysql; /* * @author lixiang * @E-mail: [email protected] * @date 2019-03-24 * @blog: threeyears.cn */ public class MysqlDome6 { public static void main(String[] args) { //9.哪些情况需要建立索引哪些情况下需要索引? String str = "需要建立索引"; switch (str){ case "需要建立索引": System.out.println("经常需要进行查询的列"); System.out.println("经常在where语句的后面的列上"); System.out.println("作为主键和外键的列上"); case "不需要建立索引": System.out.println("频繁需要修改的字段"); System.out.println("数据量太少的表"); System.out.println("查询中很少使用的列"); System.out.println("不会出现在where语句后面的"); } } }
10-19 如下
package cn.fortune.Mysql;
/*
* @author lixiang
* @E-mail: [email protected]
* @date 2019-03-24
* @blog: threeyears.cn
*/
public class MysqlDome7 {
public static void main(String[] args) {
//10.索引的最左匹配原则了解吗?
//11.如何建立复合索引,可以使sql语句能尽可能匹配到索引?
//12.建立了索引,索引就一定会被命中吗?或者说索引什么时候失效?
//13.为什么要使用联合索引?
//14.既然索引可以加快查询速度,索引越多越好是吗?
//15.主键和唯一索引的区别?
//16.InnoDB和MyISAM引擎的区别?
//17.COUNT(*)和COUNT(1)的区别?COUNT(列名)和COUNT(*)的区别?
//18.SQL注入是什么,如何防止
//19.数据库中悲观锁和乐观锁讲一讲?
}
}