面试题:MySQL部分

面试题:MySQL部分

完成:第一遍

  1. 数据库的三范式是什么?
    第一:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。
    第二:如果关系模式R满足第一范式,并且R的所有非主属性都完全依赖于R的每一个候选关键属性,称为R满足第二范式,简记为2NF
    第三:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式。
  2. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 ID 是几?
    7-2+1=6
  3. 如何获取当前数据库版本?
    一、在查询器中输入“Select@@Version”并运行,查看运行结果,对照便知版本
    二、运行SQL SERVER服务管理器,在任务栏小托盘处,右键单击管理器图标,选“关于”,在弹出的窗口中,对照信息便知
    三、在添加或删除程序中查看SQL SERVER的支持信息,可直接查看到版本号
  4. 说一下 ACID 是什么?
    ACID是事务的四大特性:
    Atomicity:原子性现在对于一个事务来讲,要么一起执行成功要么一起失败,执行的过程是不能被打断或者执行其他操作的
    Consistency:一致性表现为事务进行过后和执行前,整体系统是稳定的,比如对于入账出账操作是不会有总资金的变化的
    Isolation:隔离性表示各个事务间不会相互影响,数据库一般会提供多种级别的隔离。实际上多个事务是并发执行的,但它们之间不会相互影响
    Durability:持久性表示一旦一个事务成功了,那么他的改变是永久性的被记录和操作
  5. Char 和 VarChar 的区别是什么?
    CHAR的长度是固定的,而VARCHAR2的长度是可以变化的
    CHAR的效率比VARCHAR2的效率稍高
    目前VARCHAR是VARCHAR的同义词
  6. Float 和 Double 的区别是什么?
    Double精度高,有效数字16位,float精度7位,但double消耗的内存是float的两倍,double的运算速度比float慢得多
  7. MySQL 的内连接、左连接、右连接有什么区别?
     1.内连接,显示两个表中有联系的所有数据;
       2.左链接,以左表为参照,显示所有数据;
       3.右链接,以右表为参照显示数据;
  8. MySQL索引是怎么实现的?
    索引是一种高效获取数据的存储结构,例:hash、 二叉、 红黑。索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。
  9. 怎么验证 MySQL的索引是否满足需求?
    用explain,加在select前面,然后运行,查看key那列有没有用到你那个索引
  10. 说一下数据库的事务隔离?
    任何支持事务的数据库都必须具备四个特性,分别是:原子性,一致性,隔离性,持久性,也就是我们常说的事务ACID,这样才能保证事务中数据的正确性。事务的隔离性就是指,多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每一个并发的事务间要相互进行隔离。
  11. 说一下 MySQL常用的引擎?
    在Mysql数据库中,常用的引擎主要有两个:Innodb和MyIASM
    Innodb:提供了对数据库ACID事务的支持,并且还提供了行级锁和外键的约束。它的设计目标就是处理大数据容量的数据库系统,它本身实际上是基于Mysql后台的完整的系统
    MyISAM:是Mysql的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行Insert插入和Update更新语句时,即执行写操作的时候要锁定这个表。所以会导致效率降低。
    大容量的数据集时趋向于选择Innodb。因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的
    大批量的插入语句时在MyIASM引擎中执行的比较快,但是Update语句在Innodb下执行的会比较快,尤其在并发量大的时候
  12. 说一下 MySQL的行锁和表锁?
    表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度 最低
    行级锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度也最高
    锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源的争用以外,数据也是一种供许多用户共享的资源
  13. 说一下乐观锁和悲观锁?
    悲观锁,顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它自己拿到锁。传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作之前先上锁。
    乐观锁,顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁
    两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
  14. MySQL问题排查都有哪些手段?
    1.事务级别 :select @@global.tx_isolation
    2.输出数据当前状态:SHOW ENGINE INNODB STATUS 可用于排查死锁问题,锁定行数等问题
    3.查询数据库连接信息:select * from information_schema.PROCESSLIST
    4.查询事务信息:select * from information_schema.INNODB_TRX
    5.查询数据库锁等待信息:select * from information_schema.INNODB_LOCK_WAITS
    6.手动杀掉某个进程:kill trx_mysql_thread_id
    。。。。。。
  15. 如何做 MySQL的性能优化?
    1.为查询缓存优化你的查询
    2.EXplain的Select 查询
    3.当只要有一行数据时使用LIMIT1
    4.为搜索字段建索引
    5.在Join表的时候使用相当类型的例,并将其索引
    6.千万不要ORDER BY RAND()
    7.避免SELECT
    8.永远为每张表设置一个ID|
    9.使用ENUM而不是VARCHAR
    10.从PROCEDURE ANAKYSE()取得建议
    11.尽可能的使用NOT NULL
    12.Prepared Statements
    13.无缓冲的查询
    14.把IP地址存成UNSIGNED INT
    15.固定长度的表会更快
    16.垂直分割
    17.拆分大的DELETE或INSERT语句
    18.越小的列会越快
    19.选择正确的存储引擎
    20.使用一个对象关系映射器
    21.小心“永久链接”

你可能感兴趣的:(【MySql】)