美团面试准备之数据库

  1. 美团重点就是数据库、linux、java上,感觉只要你的java和数据库好就能进,恰巧,我是搞C++的,数据库不咋熟悉。
  2. 数据库的事务,具体在代码里怎么实现事务。比如:我往一个表里插入一个a再插入一个b再插入一个
  3. redis数据库跟本地数据库有什么区别吗
  4. redis实际工作中有用到过吗?
  5. 数据清洗是怎么清洗的
  6. 什么情境下会用到redis?
  7. 数据库熟悉吗?(不熟悉啊,没关系,我问几个问题)知道索引吗?在什么场景下用索引,索引有什么好处,有什么缺点?
  8. 面试官感觉我回答索引部分还可以,给了一个具体场景,问应该怎么做(不会)
  9. 大量问sql语句
  10. MVCC机制与乐观锁的区别
    MVCC是解决读-写冲突,读操作不阻塞写操作,写操作不阻塞读操作;乐观锁是解决写-写冲突。
    MVCC:
    读操作只读该数据开始前的数据库快照;
    读操作有快照读和当前读两种:
    简单select,不加锁属于快照读;select带插入/更新/删除操作,属于当前读,需要加锁。select
    1. 只查找创建早于当前事务ID的记录,确保当前事务读取到的行都是事务之前就已经存在的,或者是由当前事务创建或修改的;

    2. 行的DELETE BIT为1时,查找删除晚于当前事务ID的记录,确保当前事务开始之前,行没有被删除

  11. Mysql的一致性读是通过read view结构来实现。read view主要是用来做可见性判断的,它维护的是本事务不可见的当前其他活跃事务。其中最早的事务ID为up_limit_id,最迟的事务ID为low_limit_id
    可见性判断
    假设要读取的行的最后提交事务id(即当前数据行的稳定事务id)为 trx_id,可见性比较过程如下:
    1. trx_id < up_limit_id => 此记录的最后一次修改在read view创建之前,具有可见性,跳转到步骤5;
    2. trx_id > low_limit_id => 此记录的最后一次修改在read view创建之后,不具有可见性,跳转到步骤4;
    3. up_limit_id <= trx_id <= low_limit_id => 从up_limit_id到low_limit_id进行遍历,如果trx_id等于他们之中的某个事务id的话,表示该记录的最后一次修改尚未保存,不具有可见性,跳转到步骤4。否则,具有可见性,跳转到步骤5;
    4. 从此记录的DB_ROLL_PTR指针所指向的undo log(此记录的上一次修改),将undo log的DB_TRX_ID赋值给trx_id,跳转到步骤1重新开始计算可见性;
    5. 如果此记录的DELELE_BIT为false,说明该记录未被删除,可以返回,否则不返回。
  12. 乐观锁:
    写的时候同时获取该行版本号;写完之后,核对版本号是否与之前一样,不一样,说明被其他事务修改,重复操作,直到版本号没变,就提交数据。
  13. 连接的种类

    1. 左连接:left join 或 left outer join
      左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。
      如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。

    2. 右连接:right join 或 right outer join
      右向外联接是左向外联接的反向联接。将返回右表的所有行。
      如果右表的某行在左表中没有匹配行,则将为左表返回空值。

    3. 完整外部联接:full join 或 full outer join
      完整外部联接返回左表和右表中的所有行。
      当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。
      如果表之间有匹配行,则整个结果集行包含基表的数据值。

    4. 内连接
      内联接是用比较运算符比较要联接列的值的联接
      join 或 inner join
      只返回符合条件的table1和table2的列

      select * from table1 join table2 on table1.id=table2.id


      等价于

    5. A:select a.*,b.* from table1 a,table2 b where a.id=b.id
      B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join后加条件只能用where,不能用on)
    6. 交叉连接(完全)cross join (不带条件where...)
      没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)
      等价于

      select * from table1,table2
    7.  

你可能感兴趣的:(面试)