数据库

2019-02-25  本文已影响0人  rabbittttt

1 DDL、DML、DCL 分别指什么
ans: DML, Data Manipulation Language, 对数据进行操作的语句,如 select, insert, update
DDL,Data Definition Language,定义或改变表结构、数据类型、表之间的链接和约束等工作,如 create、alter、drop
DCL,Data Control Language,用来设置或更改数据库用户或角色权限的语句,如 GRANT, COMMIT, ROLLBACK
参考:https://blog.csdn.net/level_level/article/details/4248685

2 数据库的几大范式
ans: 第一范式(1NF): 每个属性必须是原子项目
第二范式(2NF):满足第一范式,且有唯一主键在表中保证每一行都具有唯一性。
第三范式(3NF):满足第一、二范式,且每一列数据都和主键直接相关,而不能间接相关。
参考:http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html

3 说说分库与分表设计,分库与分表带来的分布式困境与对应之策
ans:对于大型互联网应用,数据库的单表数据量可能达到千万级甚至亿级,此时即使采用主从模式的架构压力也会比较大,而且主从模式也只能提升读性能,写数据仍然受到master性能的限制。
通常会采用分库分表的手段优化这个问题,分表是将数据从逻辑上横向的拆分成多张表,这样可以减少每张表的记录条数,减少检索时间;分库是在物理层面将表横向拆分,每个库都有自己的master,从而提升写性能。分库分表也可以结合使用。
但是分库分表也带来几个问题:
(1)数据迁移与扩容,连续分表可能导致热点问题,而随机分表在扩展时又涉及到数据迁移问题。
(2)表关联问题,分库分表情况下,多表联合查询可能导致跨库关联,最好将数据放在程序中品种,或者采用反范式设计。
(3)分页与排序问题,与表关联同样存在跨库的问题。
(4)分布式事务,分库分表场景下如何保证数据的一致性就成为一个难题。目前分布式事务并没有很好的解决方案,难以满足数据强一致性,一般情况下,使存储数据尽可能达到用户一致,保证系统经过一段较短的时间的自我恢复和修正,数据最终达到一致。
(5)分布式全局唯一ID,在单库单表的情况下,直接使用数据库自增特性来生成主键ID已经不再适合,需要使用全局唯一 ID。
一般在项目一开始不采用分库与分表设计,而是随着业务的增长,在无法继续优化的情况下,再考虑分库与分表提高系统的性能。

4 存储引擎的 InnoDB 与 MyISAM 区别、优缺点、使用场景
ans: 区别:

5 SQL关键字的执行顺序
ans: FROM -> ON -> OUTER -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> TOP
参考:https://www.designcise.com/web/tutorial/what-is-the-order-of-execution-of-an-sql-query

6 explain 命令,包含哪些列,Type列有哪几种值。
ans: EXPLAIN命令是查看优化器如何决定执行查询的主要方法。
列信息包括:
(1)id,包含一组数字,表示查询中执行select子句或操作表的顺序;如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行;id如果相同,可以认为是一组,从上往下顺序执行。
(2)select_type,查询中每个select子句的类型

7 SQL怎么进行优化
参考:https://blog.csdn.net/jie_liang/article/details/77340905

8 limit 20000 加载很慢怎么解决
ans: 记录上一次检索的最大值,加入本次检索的where条件中,利用索引快速定位到开始检索的位置。

9 有哪几种索引,什么时候该(不该)建索引,
ans: 主键索引(Primary Key)、唯一索引(UNIQUE index)、普通索引(index)、全文索引(FullText index)

10 聚集索引与非聚集索引的区别
ans: 聚集索引:索引中键值的逻辑顺序决定了表中相应行的物理顺序(索引中的数据物理存放地址和索引的顺序是一致的)
非聚集索引:索引的逻辑顺序与磁盘上的物理存储顺序不同。

11 Mysql索引的数据结构,为什么要用 B+tree 作为 MySql
ans: B tree 是多叉查找树,对于一颗阶数为m的B-tree:

12 哈希索引,自适应哈希索引(AHI)
ans:哈希索引,就是采用哈希算法把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。但问题在于哈希索引对等值查询的速度很快,非等值查询就无能为力了,且不能利用索引完成排序。在有大量重复键值情况下,还会存在哈希碰撞问题。
自适应哈希: InnoDB存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,InnoDB就会使用索引键的前缀建立一个哈希索引。将索引值转换为一种指针,便于直接访问,带来速度的提升。
参考:https://www.cnblogs.com/bonelee/p/6224698.html
http://www.notedeep.com/note/38/page/221

13 mysql 最大链接数
ans:mysql可以自定义最大链接上限 max_connections,默认值是151
参考:https://dev.mysql.com/doc/refman/8.0/en/too-many-connections.html

14 数据库事务特性
ans: ACID:

15 MySQL如何保持事务隔离性
ans: MySQL的InnoDB引擎支持表锁、行锁,默认隔离级别是可重复读 ( REPEATABLE READ)
(1)MySQL实现的锁种类:

(2)四种隔离级别&实现原理:

(3)关于几种隔离级别下存在的问题

16 mvcc 如何保证在RR级别下避免幻读
ans: MVCC 即 Multi-Version Concurrency Control,多版本的并发控制协议。
它的主要原理是:


image.png

17 数据库连接池的作用
ans: 维护一定数量的连接,减少创建连接的时间
更快的响应时间
统一的管理
参考: https://blog.csdn.net/qq_22222499/article/details/79060495

18 最左匹配原则
ans :最左匹配原则是针对索引的。
举例来说:两个字段(name,age)建立联合索引,如果where age=12这样的话,是没有利用到索引的,这里我们可以简单的理解为先是对name字段的值排序,然后对age的数据排序,如果直接查age的话,这时就没有利用到索引了,查询条件where name=’xxx’ and age=xx 这时的话,就利用到索引了,再来思考下where age=xx and name=’xxx‘ 这个sql会利用索引吗,按照正常的原则来讲是不会利用到的,但是优化器会进行优化,把位置交换,这个sql也能利用到索引了

18 如何实现 update的乐观锁, select悲观锁
ans:
(1)乐观锁:mysql 语法不支持乐观锁,需要自己实现: 通过比较版本号/旧值
(2)悲观锁:select -> select ... for update
参考:https://www.cnblogs.com/zhiqian-ali/p/6200874.html
https://stackoverflow.com/questions/17431338/optimistic-locking-in-mysql

上一篇 下一篇

猜你喜欢

热点阅读