最近在准备面试,整理了一些面试问题。
java mysql的三种驱动类型?
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
new com.mysql.jdbc.Driver() ;//创建driver对象,加载数据库驱动
System.setProperty("jdbc.driver","com.mysql.jdbc.Driver");//系统属性指定数据库驱动
mysql的锁?
略
聚簇索引和非聚簇索引的区别?
聚簇索引: innodb使用聚簇索引和普通索引 myIsam使用非聚簇索引
- 聚集索引就是以主键创建的索引
- 每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放。实际的数据页只能按照一颗B+树进行排序。
- 表记录的排序和索引的排序一直
- 聚簇索引存储记录是物理上的连续存在。
- 聚簇索引主键的插入速度比飞聚簇索引慢很多。
- 聚簇索引适合排序,因为聚簇索引叶子节点本身就是索引和数据按照相同的顺序放在一起,索引序列就是数据序列。非聚簇索引的叶子节点保留了一个指向数据的指针,索引本身是排序的,但是数据未排序,数据查询需要消耗额外的IO。
- 更新聚簇索引的代价很高,因为会强制innodb将每个被更新的行移动到新的位置。
非聚集索引
- 非聚簇索引的叶子节点仍然是索引节点,并保留一个指针指向数据块。
- 聚簇索引适合排序,非聚簇索引不适合用在排序场合。
- 非聚簇索引是逻辑上的连续,聚簇索引是物理上的连续。
聚簇索引为什么快?
使用聚簇索引找到第一个值的行后,可以保证后续的索引行在相邻的物理位置上。
建立聚簇索引有什么需要注意的地方?
聚簇索引中不要包含经常被修改的列。因为码值修改后,数据行必须移到新的位置,索引此时会重排,会造成很大的资源浪费。
innodb主键生成规则(聚簇索引生成规则)?
优先使用用户自定义主键。 没有主键 使用第一个unique键作为主键。 没有unique键 为表添加一个隐式的row_id隐藏列作为主键。
非聚簇索引最多多少个?
249个,非聚簇索引需要大量的硬盘空间和内存。
Btree和Hash索引有什么区别?
- btree 索引需要用到多次折半查找来找到对应的数据块。
- hash 索引通过hash函数计算出hash值 在表中找到对应的数据。
- 大量不同数据的等值精确查询,hash索引效率通常比btree高。
- hash不支持模糊查询,范围查询和联合索引最左匹配规则,这些btree都支持。
什么时候建立索引
- 需要排序,查询,分组和连接查询的字段适合建立索引。
- 索引多,数据更新表越慢,尽力使用字段值不重复比例大的字段作为索引,联合索引比多个独立索引效率高。
- 频繁查建立索引,频繁更新不建立索引。
- 数据增删改的时候,索引也会动态维护,降低数据维护速度。
为什么是B+树 不是B树,红黑树,B-树
- b+树非叶子节点只存储键值信息 降低b树高度。
- 红黑树和B树,高度明显要高很多,效率比B+树要差很多。
- B树的劣势,由于键会重复出现,因此会占用更多的空间。但是和带来的性能优势相比,空间劣势可以接受,因此B+树在数据库中使用比B树更广泛。
什么时候索引会失效?
- 条件是or 如果想生效,要给or的每个字段加索引。
- like 开头通配符%
- 如果列是字符串类型,那么查询条件一定要用引号引用起来,否则数据类型转换不会使用索引。
- where中的索引列使用函数或者运算。
数据库的事务特点?
ACID 原子性,一致性,隔离性,永久性。
数据库事务是如何实现的?
- 通过预写日志实现的,redo和undo机制是数据库实现事务的基础。
- redo日志用来在断电/数据库崩溃等状况发生时重演一次刷数据的过程,把redo日志里的数据刷到数据库里,保证了事务的持久性。
- undo日志是在事务执行失败的时候撤销对数据库的操作,保证了数据库的原子性。
说说数据库的隔离级别?
- 未提交读:允许脏读,不可重复读,幻读。脏读:可能读取到其他会话中未提交事务修改的数据
- 不可重复读(提交读):不可重复读-幻读。不可重复读: A只能读B已提交的事务,但是A还没结束,B又更新数据隐式提交,然后A又读了一次出现不可重复读。只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。
- 可重复读:允许幻读。幻读:事务开启,不允许其他事务的UPDATE修改操作 A读取B已提交的事务,然而B在该表插入新的行,之后A在读取的时候多出一行,出现幻读。可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读。
- 串行化。
Spring事务的传播级别?
mysql深分页解决?
- join 优化
-- 原sql
SELECT * from dc_base_oms_sku limit 5000000,100;
-- 优化sql
SELECT * from dc_base_oms_sku t1
INNER JOIN (SELECT id from dc_base_oms_sku limit 5000000,100) t2 on t1.id =t2.id;
- 子查询优化 原理同上
- 书签记录,记录上一页的标识,减少扫描行 where col > 'XX' 局限需要业务连续自增(雪花算法),业务能包容这种连续概念。
-- 原sql
SELECT * from dc_base_oms_sku limit 5000000,100;
-- 优化sql
SELECT * from dc_base_oms_sku t1 where id > 1000000 limit 100;
数据库查询流程?
客户端-连接器-查询缓存-分析器-优化器-执行器-引擎
数据库查询每个步骤都做了什么事情?
- 连接器: tcp握手,身份验证,showprocesslist,wait_timeout控制时长默认8小时。长链接不断开,内存会提升。
- 数据库查询缓存: 没啥用 很容易失效 8.0后就取消了。
- mysql分析器: 分析词法错误
- mysql优化器: 判断使用哪些索引,对执行顺序进行优化:先查还是先关联 先查哪个表,会出现很多方案,由优化器决定使用哪一种方案。
select SQL_NO_CACHE * from B
B树和B+树的区别,B树和avl树?
- avl树更新和删除都是logN时间复杂度 然后高的比较高
- b+树是b树的升级版本,冗余了B树的非叶子节点,并且叶子节点之间有指针相连。可以提高范围查找的效率(会有指针指向下一个叶子节点。)
mysql一个b+树的节点到底存多少个元素最合适?
一页或者一页的倍数,原因装满不浪费。即使读一条超过一页也要读一页。
页的概念
- mysql的基础存储结构是页。
- 一页16kb
- file header 38byte
- page header 56byte
- infimum + supermum 26byte 存放记录
- user records 不确定 存放记录
- free space 不确定
- page directory 不确定
- file tailer 8byte
- 各个数据页可以组成一个双向列表。
- 每个数据页中的记录可以组成一个单向链表。
- 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录
- 以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。 引申回表,索引覆盖。
数据库备份命令
mysqldump 成sql文件,或者navicat操作