weiguoxin 2019-12-08
还有联合索引等。
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因
ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLocal 的经典使用场景是数据库连接和 session 管理等。
3.说一下 synchronized 底层实现原理?
synchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元。在 Java 6 之前,monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。但在 Java 6 的时候,Java 虚拟机 对此进行了大刀阔斧地改进,提供了三种不同的 monitor 实现,也就是常说的三种不同的锁:偏向锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能。
脏读:读取未提交的数据
不可重复读:一个事务中多次读取,读取的内容不一样了。被其他事务改过了。
幻读:一个事务中多次读取,数据总量不一样了。其他事务新增或删除了。
第一范式:1nf,列不可再分,确保每一列的原子性
第二范式:2nf,属性完全依赖于主键。即,数据库的每一个实例或行可以被唯一区分
第三范式:3nf,属性不依赖于其他非主属性,属性直接依赖于主键。
5. 165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?
表类型如果是 MyISAM ,那 id 就是 8。
表类型如果是 InnoDB,那 id 就是 6。
InnoDB 表只会把自增主键的最大 id 记录在内存中,所以重启之后会导致最大 id 丢失。
6.Myisam和Innodb的区别
1、myisam只支持表级锁 Innodb支持行级锁
2、myisam不支持事务 Innodb支持事务
3、myisam不支持外键 Innodb支持外键
4、myisam支持全文索引,Innodb不支持
5、myisam本身存储了表的总数据行,Innodb没有存储,查总行数myisam更快,如果加了查询条件两者就没有区别了
聚簇索引和非聚簇索引
聚簇索引主要应用于Innodb
非聚簇索引主要应用于Myisam
表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。
非聚集索引。表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。
6. char 和 varchar 的区别是什么?
char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7 个是空字节。
chat 优点:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的,使用 char 非常合适。
varchar(n) :可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
所以,从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适,二者使用需要权衡。
如:varchar(100)表示最大存储100个,如果实际就2个,实际占得存储空间也是2,但是char就不是了。Char(100)实际开辟的空间也是100,即使存2个,所以浪费空间。
MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
8. Redis 怎么实现分布式锁?
Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。
占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁。
Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。
9. 说一下类装载的执行过程?
类装载分为以下 5 个步骤:
加载:根据查找路径找到相应的 class 文件然后导入;
检查:检查加载的 class 文件的正确性;
准备:给类中的静态变量分配内存空间;
解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;
初始化:对静态变量和静态代码块执行初始化工作。
10. 常用的 JVM 调优的参数都有哪些?
-Xms2g:初始化推大小为 2g;
-Xmx2g:堆最大内存为 2g;
-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;
-XX:SurvivorRatio=8:2设置新生代 Eden 和 Survivor 比例为 8:2;
-XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;
-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;
-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;
-XX:+PrintGC:开启打印 gc 信息;
-XX:+PrintGCDetails:打印 gc 详细信息。
11.Blob和text的区别
Blob是存储二进制对象的。唯一的区别是blob在查询和排序的时候区分大小写,而text不区分大小写。
12.一个表最大可以创建多少个索引?
任何标准表最多可以创建16个标准列索引。
13. 主键唯–一标识一条记录,不能有重复的,不允许为空
外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值
索引–该字段没有重复值,但可以有一个空值
14.B树、B-树、B+树、二叉树、红黑树、聚簇索引和非聚簇索引。
B树和B-树为同一个树,只是叫法不同。
B树特征:
B树是一种平衡的多路搜索树,节点最大的孩子的数据成为B树的阶。一个m阶B树具有如下属性:
1》 关键字集合分布在整棵树中
2》 任何一个关键字出现且出现在一个节点中。
3》 搜索有可能在非叶子节点结束
4》 其搜素性能等价于在关键字全内做一次二分查找。
5》 自动层次控制。
6》 所有的子节点位于同一层。
B+树除了与B-树相同的属性外,还有以下属性:
1》 为所有叶子节点增加一个链指针
2》 所有关键字都在叶子节点中出现。
二叉树:
1》 所有非叶子节点最多拥有两个子节点
2》 所有的每个节点只能存储一个关键字。
3》 非叶子节点的左小于右。
红黑树:
1》 每个节点不是红色就是黑色
2》 根节点为黑色
3》 每个叶子节点都是黑色的
4》 每个红色节点的子节点都是黑色的
5》 红连接均为左连接
6》 自平衡二叉树。
总结:
二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
B(B-)树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;