Mysql复习

  1. MySql的事务隔离级别

        在理解事务的隔离级别之前,首先需要明白,为什么需要隔离级别?没有事务的隔离,在事务并发访问的时候会出现如下三种问题:脏读、不可重复读、幻读。

package cn.fortune.Mysql;

/*
 * @author lixiang
 * @E-mail: getSession@aliyun.com
 * @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: getSession@aliyun.com
 * @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: getSession@aliyun.com
 * @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: getSession@aliyun.com
 * @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: getSession@aliyun.com
 * @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: getSession@aliyun.com
 * @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: getSession@aliyun.com
 * @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.数据库中悲观锁和乐观锁讲一讲?
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值