mysql面试知识点

一、数据库设计的三大范式

        1.表中字段不可再分割;

        2.必须有主键,非主键列完全依赖于主键;

        3.在2的基础上,非主键之间不能存在依赖。

二、存储引擎

        (一)常见的存储引擎

        InnoDB,MyIsAM,Archive,Memory等。只有InnoDB支持事物。

        (二)InnoDB和MyIsAM的比较

         (三)事物

        1.原子性:指事物执行要么成功要么失败。

        2.一致性:指事物提交前后数据保持一致。例如转账,甲乙二人金额总数是一致的。

        3.隔离性:事物提交过程中不受其他事物的干扰和影响。

        4.持久性:事物提交后会落盘到磁盘中持久化。

        (四)常见的现象

        1.脏读:指事物执行过程中读取到其他事物还未提交的数据;

        2.不可重复度:事物中的两次查询结果中的数值不一致,强调同一行数据的差异;

        3.幻读:事物中的两次查询结果中的数据不一致,强调结果中的行数发生变化。

        (五)事物的隔离级别

        1.读未提交:会发生脏读、幻读和不可重读读的问题;

        2.读已提交:会发生幻读和不可重复读的问题;

        3.可重复读:会发生幻读问题;

        4.可串行:不会发生上述问题。

                隔离级别越高,并发效率越低。大部分数据库的默认隔离级别为读已提交,而mysql默认隔离级别为可重复读。在5.0之前的mysql的默认隔离级别也是读未提交,这和mysql的主从一致性有关。5.0版本之前,mysql的bin log文件的存储格式为statment,只记录对数据库的修改操作,不记录其他操作,导致主从一致性方面做的很差,数据经常不一致,因此隔离级别发生变化。

三、索引

       (一)B+树与B树的区别

           1.b+树非叶子结点仅包含关键字信息,b-树所有节点都有一个指针;

           2.b+树叶子结点存储有索引和数据信息,b-树所有节点都有索引和数据信息;

           3.b+树的叶子结点之间使用双向链表连接,是有序的,方便范围查找。

       (二)索引类型 

            聚族索引和非聚族索引。(聚族索引又称为主键索引,主键索引要求不能为null,不能重复)

            单列索引、组合索引、唯一索引(唯一索引要求值唯一,但允许有null值,例如手机号)

       (三)使用索引的建议

区、左、*、联,算、串、模、排

            1.索引必须要有区分度;

            2.索引设计需要符合最左匹配原则;

            3.尽量能不select *就不使用select *,能明确的字段尽量写清楚;

            4.尽量多使用联合索引加快查询效率;

            5.索引字段中不能有运算,包括加减乘除等;

            6.索引中不能包含字符串和数字的模糊匹配;

            7.尽量少使用模糊查询;比如like,%张这种查询;

            8.排序尽量使用索引字段。

       (四)explain--sql性能分析神器

           1.通过explain分析可获知那些信息?

                    访问类型type、可能存在的索引、实际命中的索引、查询了多少行、执行时间。

            2.type:

                system > const > eq_ref > ref > range > index > all

                system:表中只有一条数据;

                const:通过索引一次就查到了数据;

                eq_ref:索引只有一条数据匹配;

                ref:索引有多条数据匹配;

                range:查询到给定范围的数据;

                index:索引失效;

                all:全表查询。

                    sql语句最低要求要达到range级别,尽可能达到ref级别。

       (五)大表如何优化

            策略:1.限定查询范围(只能查半年内的聊天记录等);

                       2.读写分离;

                       3.分库分表,垂直水平拆分;等

四、mysql的日志

               主要包括查询日志、事物日志、bin log 等,比较重要的是bin log和redo/undo log。

        1.bin log:二进制日志文件。是数据库级别的日志文件,主要记录对表的修改操作(划重点:表、修改)。主要用于恢复数据和同步数据。bin log文件中数据的存储格式有三种,分别是statment、row和mix。

        2.redo log:InnoDB存储引擎级别的日志文件,用于记录事物的操作,可保证数据的完整性。

        3.undo log:相当于一个版本控制工具,记录了redo log数据以及表中数据的不同版本。可利用它实现事物的回滚操作。


五、mysql架构

            一条数据库语句从客户端传到DB服务端的大致流程:



六、mysql并发策略

        1.乐观锁

        2.悲观锁

        3.行锁

        4.表锁

        5.页锁

        6.时间戳

        7.redis分布式锁

你可能感兴趣的:(mysql面试知识点)