• 前端
  • JS
  • CSS
  • HTML
  • Mysql
  • Linux
  • SVN
  • 环境uedbet官网手机版最新
  • uedbet西甲体育投注详解
  • MAC_BOOK
  • 算法
  • 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