mysql经典面试题
By skyshappiness Posted 2020-11-17 21:13:48 In

一、mysql的四个特性:

    原子性:事务是mysql的逻辑工作单位。事务中包含的各种操作要么都操作成功,要么都不执行
    一致性:数据库从一个一致性状态变到另一个一致性状态。(参考备份的例子:必须保证数据在备份那一时间点的数据一致性)
    隔离性:两个事务之间互不干涉
    持续性:事务一旦提交。后续的修改都不在影响本次的事务提交。


二、事务的隔离级别:

    read uncommited (读未提交):

        一个事务都可以看到其他未提交事务的执行结果

    read commited (读提交):

        一个事务可以看到其他已提交事务所做的改变

    repeatable read (可重复读):默认的隔离级别

        确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。

    serializable(可串行化):

        最高等级的事务隔离级别。强制事务进行排序,使之不可能相互冲突,从而解决幻读问题。在每个读的数据行上加上共享锁。


三、mysql的并发问题:

    1、脏读:事务A读取了事务B更新的数据,然后事务B回滚了,那么A读取的就是脏数据

    2、不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新并提交的动作 ,导致事务A多次读取同一数据时,结果不一致。

    3、幻读:读出来的数据,在后续使用的时候发生了明显的变化,导致无法进行操作。

         mysql如何解决幻读的:

             RR模式下:MMVC 或 行锁+间隙锁

             或者将mysql隔离级别提高至 串行化,但会影响并发


四、mysql的锁

    



五、mysql三范式

    1、原子性:表中的字段应该是最小单位,不可再分割;例:收货地址应该拆分成 省-市-区-街道-门牌号 5个字段。

    2、唯一性:表中的每一列都应该和联合主键相关;例订单商品表中的所有字段,都应该和订单号+商品编号的主键相关联

    3、冗余性:无冗余字段,不存在传递依赖


六、索引的实现原理

    1)分类:

             聚集索引:就是主键索引;当主键索引不存在时,第一个非空唯一索引就是聚集索引;如果以上都不存在,innodb创建一个隐藏的row-id作为聚集索引

             普通索引:除聚集索引之外的所有索引。即非聚簇索引也叫二级索引。


七、索引的最左原则

    联合索引:对一张表上的多列进行索引。表上多个列加起来组成一个索引。其排序规则如下图所示。

    最左原则:

        

       对字段 1、2、3 进行联合索引时,它的排序方式如上图所示。


八、mysql回表

    回表的定义:先通过普通索引扫描出数据所在的行,再通过主键ID取出索引中未包含的数据。

    示例:

        CREATE TABLE t_back_to_table (
          id INT PRIMARY KEY,
          drinker_id INT NOT NULL,
          drinker_name VARCHAR (15) NOT NULL,
          drinker_feature VARCHAR (15) NOT NULL,
          INDEX ( drinker_id )
        ) ENGINE = INNODB; 

        INSERT INTO t_back_to_table (id, drinker_id, drinker_name, drinker_feature) VALUES
        ( 1, 2, '广西-玉林', '喝到天亮' ),
        ( 2, 1, '广西-河池', '白酒三斤半啤酒随便灌' ),
        ( 3, 3, '广西-贵港', '喝到晚上' ),
        ( 4, 4, '广西-柳州', '喝酒不吃饭' );

         select * from t_back_to_table where id = X; 此处因为ID是主键索引所以不需要回表

         select * from t_back_to_table where drinker_id = 1; 此处使用的是普通索引,因此需要回表

             回表示例图:

            

        如何防止回表:

            索引覆盖:实现在一棵索引树上就能获取sql所需的所有列数据;即将查询的字段,放入联合索引之中


参考资料:

1、mysql数据库一致性解释:https://blog.csdn.net/weixin_39640090/article/details/113169220

2、高性能MYSQL

3、mysql回表:https://www.cnblogs.com/taojietaoge/archive/2022/04/23/16167188.html

友情链接
联系方式
  • 邮箱 / E-mail:121388038@qq.com