MySql面试题整理

简单说两句:在整理MySql数据库知识点之前,我对于MySql的了解在 CRUD、创建数据库、表、设计字段、创建索引的基本层面。对于sql语句的优化也就记住了创建索引、用exists代替in,分表分库、读写分离。但是你要问我索引怎么设计,什么时候索引会失效、分表怎么分、数据库字段长度都要设置成多少、tinyint能存多少,int能存多少,varchar能存多少,数据库编码gbk和utf-8区别、MyISAMh和InnoDB什么区别,各自适合哪种场景。我基本说不上来。每次升级把数据库提交给负责人的时候都是心惊胆战,有种老师批改作业的既视感 /哭笑

·

面试题:主张言简意赅,精确概括

  1. ACID是什么
    • Atomicity原子性:一个事务中的所有操作或者全部完成,或者全部不完成
    • Consistency一致性:在事务开始之前和结束之后,数据库的完整性没有被破坏
    • Isloation隔离性:数据库允许多个并发事务同时对数据库进行读写操作,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,事务隔离级别包括:读未提交,读计较,可重复读,串行话
    • Durability持久性:事务处理完后,对数据的修改是永久性的
  2. char和varchar区别
    • char:固定长度,当输入的内容不足时,用空字符填充,优点:效率高,缺点:占用空间
    • varchar:可变长度,在varchar小于255时用一个字节来存储长度,大于255时,用两个字节来存储字符串长度
  3. float和double区别
    • float最多存储8位的十进制,占4个字节
    • double最多存储16位的十进制,占8个字节
  4. 内连接、左连接、右连接的区别
    • 内连接:把匹配的关联数据显示出来
    • 左连接:把左边表中的数据全部显示出来
    • 右连接:把右边表中的数据全部显示出来
  5. 如何验证索引是否满足需求
    • explain select * from …
  6. 事务的隔离级别
    • read-uncommitted:未提交读,最低隔离级别,事务未提交前,就可以被其他事务读取
    • read-committed:提交读,一个事务提交后才能被其他事务读取到
    • repeatable-read:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容一致,禁止读取到别的事务未提交的数据
    • serializable:序列化,代价最高最可靠的隔离级别
    • 注意一点,myIsam是不支持事务的,而InnoDB支持
    • 脏读:一个事务能读取到另一个事务未提交的数据
    • 不可重复读:在一个事务中,多次读取同一数据
    • 幻读:用一事务内多是查询返回的结果集不一样
  7. InnoDB和MyIASM引擎
    • InnoDB支持acid事务,提供了行级锁和外键约束,设计的目标是处理大数据容量的数据库系统,Mysql运行的时候Innodb会在内存中建立缓冲池用于数据缓冲和索引,但是不支持全文索引,不会保存表的行数,进行select count(*) 会扫描全表,由于锁的粒度小,写操作不会锁定全表,在并发度较高的场景下使用会提升效率
    • MyISAM 不提供事务,不提供行级锁,当执行插入和更新语句时,后需要锁定表,并发操作时效率不及innodb,但是支持全文索引,保存表的行数,索引文件与数据文件分开单独存放,适用于读操作远大于写操作的场景
  8. 乐观锁和悲观锁
    • 乐观锁:每次读取数据的时候都认为别人不会修改,所以不上锁
    • 悲观锁:每次读取数据的时候都认为别人会修改,所以上个锁
  9. MyISAM CHK 是什么
    • 用来压缩MyISAM表,减少磁盘使用空间
  10. MyISAM static 和 MyISAM Dynamic 区别
    • static:所有字段有固定款第
    • dynamic:将具有TEXT、BLOB等字段用不同长度的数据类型
  11. 如果一个表有一列定义为TIMESTAMP,将发生什么
    • mysql 5.5版本及以前,只能有一个
    • mysql 5.5版本以后,可以有多个,直接在新增数据时直接插入
  12. BLOB和TEXT区别
    • BLOB区分大小写,TEXT不区分大小写
  13. MyISAM存储格式
    • 每个MyISAM表格以三种格式存储在磁盘上
    • .frm:文件存储表定义
    • .myd(mydata) 数据文件
    • .myi(myindex) 索引文件
  14. NOW() 和 CURRENT_DATE() 区别
    • NOW() 用于显示当前年月日 时分秒
    • CURRENT_DATE() 显示年月日
  15. 数据库怎么优化
    • 允许部分字段冗余,尽量避免join查询
    • 选择合适的字段类型和存储引擎
    • 添加索引
    • 主从分离
    • 垂直拆分数据库
    • 添加缓存
    • 书写高效sql
  16. 锁怎么优化
    • 读写分离
    • 分段加锁
    • 减少锁时间
    • 不要将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效果不如大锁
  17. 索引的底层实现
    • B+ Tree
  18. 什么样的索引设置了无法使用
    • %开头的like
    • or
    • 数据类型出现隐式转化:如varchar 不加单引号的话可能会自动转化为int型
  19. mysql的优化方向
    • 索引
    • sql语句
    • 高并发情况下
    • 分布式缓存
    • CDN
    • 数据库读写分离
  20. 存储时间
    • DateTime 以YYYY-MM-DD HH:MM:SSS 存储时间,占用8个字节且与时区无关
    • Timestamp: 以时间戳格式存储,范围在1970-1-1 到 2038-1-19,显示依赖于设置的时区,占用4个字,也是以YYYY-MM-DD HH:MM:SSS显示
    • Date:占用3个字节,存储年月日
    • Time: 显示时分秒
    • 使用int存储日期时间不如使用timestamp
  21. 什么是基本表,什么是视图
    • 基本表:本身独立存在的表,在sql中一个关系就对应一个表
    • 视图:一个或者几个基本表导出的表,视图本身不独立存储在数据库中,是一个虚表
  22. null是什么
    • null 表示unknow,不表示""(空串),对null这个值的任何比较都会产生一个null值,可以用 is null 来判断 null
  23. 对sql语句优化的方法有哪些
    • 用exists替代 in ,用 not exists 替代 not in
    • 避免在所以列上使用计算
    • 避免中断索引
    • 对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by 、group by涉及的列上建立索引
    • 尽量避免在where子句中对字段进行null值判断,否则将导致索引失效,进行全表扫描
    • 尽量避免在where子句中对字段进行表达式操作

提升自己的核心竞争力,学会为自己撑伞, 你可以的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章