java面试---mysql

  1. 数据库的三范式是什么?
    第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要
    求,否则,将有很多基本操作在这样的关系模式中实现不了。
    第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
    第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.

  2. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
    9

  3. 如何获取当前数据库版本?
    打开mysql在命令提示符上输入 select version();
    输入 mysql -V

  4. 说一下 ACID 是什么?
    ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).

  5. char 和 varchar 的区别是什么?
    char是一种固定长度的类型,varchar则是一种可变长度的类型

  6. float 和 double 的区别是什么?
    它们都代表浮点数。FLOAT用于单精度,而DOUBLE是双精度数字。
    MySQL的单精度值使用四个字节,双精度值使用八个字节。

  7. mysql 的内连接、左连接、右连接有什么区别?
    1、内连接:系统会自动忽略两个表中对应不起来的数据
    2、左连接:显示关键词left左边表中的所有数据,右边表数据数据少了补NULL值,数据多了不显示
    3、右连接:显示关键词右表中的所有数据,左边表数据数据少了补NULL值,数据多了不显示

  8. mysql 索引是怎么实现的?
    MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,B+Tree索引,哈希索引,全文索引等等,
    1、哈希索引:
    只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。
    2、全文索引:
    FULLTEXT(全文)索引,仅可用于MyISAM和InnoDB,针对较大的数据,生成全文索引非常的消耗时间和空间。对于文本的大对象,或者较大的CHAR类型的数据,如果使用普通索引,那么匹配文本前几个字符还是可行的,但是想要匹配文本中间的几个单词,那么就要使用LIKE %word%来匹配,这样需要很长的时间来处理,响应时间会大大增加,这种情况,就可使用时FULLTEXT索引了,在生成FULLTEXT索引时,会为文本生成一份单词的清单,在索引时及根据这个单词的清单来索引。FULLTEXT可以在创建表的时候创建,也可以在需要的时候用ALTER或者CREATE INDEX来添加
    3、BTree索引和B+Tree索引
    BTree索引
    BTree是平衡搜索多叉树,设树的度为2d(d>1),高度为h,那么BTree要满足以一下条件:
    每个叶子结点的高度一样,等于h;
    每个非叶子结点由n-1个key和n个指针point组成,其中d<=n<=2d,key和point相互间隔,结点两端一定是key;
    叶子结点指针都为null;
    非叶子结点的key都是[key,data]二元组,其中key表示作为索引的键,data为键值所在行的数据;
    在BTree的机构下,就可以使用二分查找的查找方式,查找复杂度为h*log(n),一般来说树的高度是很小的,一般为3左右,因此BTree是一个非常高效的查找结构。
    B+Tree索引
    B+Tree是BTree的一个变种,设d为树的度数,h为树的高度,B+Tree和BTree的不同主要在于:
    B+Tree中的非叶子结点不存储数据,只存储键值;
    B+Tree的叶子结点没有指针,所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址;
    B+Tree的每个非叶子节点由n个键值key和n个指针point组成;

  9. 怎么验证 mysql 的索引是否满足需求?
    1、较频繁地作为查询条件的字段
    2、唯一性太差的字段不适合建立索引
    3、更新太频繁地字段不适合创建索引
    4、不会出现在where条件中的字段不该建立索引

  10. 说一下数据库的事务隔离?
    READ UNCOMMITTED(读未提交数据):允许事务读取未被其他事务提交的变更数据,会出现脏读、不可重复读和幻读问题。
    READ COMMITTED(读已提交数据):只允许事务读取已经被其他事务提交的变更数据,可避免脏读,仍会出现不可重复读和幻读问题。
    REPEATABLE READ(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
    SERIALIZABLE(序列化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,可避免所有并发问题,但性能非常低。

  11. 说一下 mysql 常用的引擎?
    InnoDB存储引擎、MyISAM存储引擎、MEMORY存储引擎

  12. 说一下 mysql 的行锁和表锁?
    MySQL的存储引擎是从MyISAM到InnoDB,锁从表锁到行锁。后者的出现从某种程度上是弥补前者的不足。比如:MyISAM不支持事务,InnoDB支持事务。表锁虽然开销小,锁表快,但高并发下性能低。行锁虽然开销大,锁表慢,但高并发下相比之下性能更高。事务和行锁都是在确保数据准确的基础上提高并发的处理能力。

  13. 说一下乐观锁和悲观锁?
    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它自己拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

    乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

  14. mysql 问题排查都有哪些手段?
    SHOW PROCESSLIST;
    —当前MySQL数据库的运行的所有线程;
    INNODB_TRX; — 当前运行的所有事务;
    INNODB_LOCKS; — 当前出现的锁;
    INNODB_LOCK_WAITS; — 锁等待的对应关系;
    SHOW OPEN TABLES where In_use >0; — 当前打开表;
    SHOW ENGINE INNODB STATUS \G; —Innodb状态

  15. 如何做 mysql 的性能优化?
    1.为查询缓存优化你的查询
    2.EXPLAIN 你的 SELECT 查询
    3.当只要一行数据时使用 LIMIT 1
    4.为搜索字段建索引
    5.在Join表的时候使用相当类型的例,并将其索引
    6.千万不要 ORDER BY RAND()
    7.避免 SELECT *
    8 永远为每张表设置一个ID
    9.使用 ENUM 而不是 VARCHAR
    10.从 PROCEDURE ANALYSE() 取得建议
    11.尽可能的使用 NOT NULL
    12.Prepared Statements
    13.无缓冲的查询
    14.把IP地址存成 UNSIGNED INT
    15.固定长度的表会更快
    16.垂直分割
    17.拆分大的 DELETE 或 INSERT 语句
    18.越小的列会越快
    19.选择正确的存储引擎
    20.使用一个对象关系映射器(Object Relational Mapper)
    21.小心“永久链接”

你可能感兴趣的:(java,mysql)