Java面试题—数据库篇

索引

索引本质是一种数据结构。

  • 优缺点
    优点:1.所有的字段均可设置索引;2.大大加快数据查询速度
    缺点:1.创建和维护索引需要花费时间,并且随着数据量的增加所耗费的时间也会增加;2.索引也需要占用空间;3.当对表中数据进行增删改时,索引需要动态维护,降低了数据的维护速度。
  • 使用原则:
    1.对经常更新的表要避免使用过多索引,经常查询的表字段应创建索引
    2.数据量小的表不宜使用索引,遍历全部数据可能比遍历索引时间还要短,索引的优化效果无法体现
    3.在取值少的字段上(如性别)不要建立索引,取值多的可以
  • 索引类型
    • 普通索引:最基本的索引,没有任何限制
      CREATE INDEX indexName ON mytable(username(length)) #最基本的创建方式
      ALTER table tablename ADD INDEX indexName(columnName) #修改表结构创建
      INDEX [indexName] (username(length)) #创建表时直接指定
      DROP INDEX [indexName] ON mytable #删除索引
    • 唯一索引:使用UNIQUE关键字,索引值必须唯一,允许有空值。
    • 组合索引:两个或更多列上的索引被称为组合索引,又称联合索引。创建组合索引时,应该仔细考虑列的顺序。使用时遵循最左前缀原则。

      最左前缀原则:针对B+树索引,最左优先,如创建了联合索引(A, B, C),相当于创建了(A)单列索引、(A, B)组合索引、(A, B, C)组合索引。

    • 全文索引:只有在MyISAM引擎上才能使用,只能在char,varchar,text类型字段上使用全文索引
  • MySQL中的索引存储类型
    包括B+树Hash两种,一般使用B+树索引,原因:
    1.Hash索引仅满足"="、"in"和""查询,不能使用范围查询
    2.对于组合索引Hash索引不能利用部分索引值查询
    3.需要扫描表,无法从Hash索引中直接完成查询,还是要回表查询数据。

  • MySQL存储引擎介绍
    包括 MyISAM、InnoDB、MEMORY(也叫HEAP)三种,其中:
    MyISAM和InnoDB存储引擎:只支持B+树索引
    MEMORY存储引擎:支持Hash和B+树索引

  • B树和B+树区别,B+树为什么更适合用于索引
    区别:
    1.B+树中具有n个关键字的结点含有n个分支;B+树中具有n个关键字的结点含有n+1个分支
    2.B+树中叶子结点包含信息,包含了全部关键字,B树叶子结点不包含信息,内部结点存储关键字信息
    3.B+树中所有非叶子结点仅起到了一个索引的作用,B树中每个关键字对应一个记录的存储地址
    4.B+树上有一个指针指向关键字最小的叶子结点,所有叶子结点链接成一个线性链表,B树没有
    B+树为什么更适合:
    1.B+树的中间结点不保存数据,所以磁盘页能容纳更多元素,更矮胖,一次性查找的关键字也就越多,相对来说IO读写次数也就降低了
    2.由于非叶节点并不是最终指向文件内容的结点,只是叶结点关键字的索引,索引任何关键字查找必须走一条从根节点到叶结点的路,所有关键字查询路径长度相同,数据查询效率相对更稳定


范式

六大范式:

  1. 第一范式(1NF):每一列都是不可分割的原子数据项,而不是集合、数组、记录等非原子项。
  2. 第二范式(2NF):在1NF基础上,要求数据库表中每个记录必须可以被唯一的区分,选择一个能区分每个实体的属性或属性组。
  3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其他非主属性。
  4. 巴斯-科德范式(BCNF):在3NF基础上,任何非主属性不能对主键子集依赖。
  5. 第四范式(4NF):要求把同一表内的多对多关系删除。
  6. 第五范式(5NF):从最终结构重新建立原始结构

事务

事务是对数据库中一系列操作进行统一的提交或者回滚操作,用来保证数据的完整性和一致性。

  • 事务并发问题:
    脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的就是脏数据。
    不可重复读:事务A读取了事务B已经提交的更改数据
    幻读:事务A读取事务B提交的新增数据

事务必须服从ACID原则:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
原子性:事务包含的所有操作要么全部成功,要么全部失败回滚
一致性:事务开始前和结束后,数据库的完整性约束没有被破坏,如A向B转账,不可能A扣了钱B却没收到。
隔离性:多用户访问时,多个并发事务之间要互相隔离,只允许一个事务请求同一数据,不同事物之间没有干扰。

事务隔离级别
读未提交:一个事务可以读物另一个未提交事务的数据。允许脏读取
读提交:一个事务要等另一个事物提交后才能读取数据。允许不可重复读取,但不允许脏读。
可重复读:在开始读取数据(事务开启)时,不再允许修改操作。禁止不可重复读取和脏读取,可能出现幻读。
序列化:最高的事务隔离级别,在该级别下事务串行化顺序执行。可以避免脏读、不可重复读和幻读。较耗性能,一般不使用。

持久性:事务一旦被提交了,对数据库中的数据改变就是永久性的。


SQL优化

  1. 在表中建立索引, 优先考虑where,group by使用到的字段
  2. 查询条件时,避免使用select ,使用具体字段代替
  3. 模糊查询不要两边都用%,会进行全表扫描,只在一侧加%
  4. 避免使用in和not in,会进行全表扫描,用between,exists相关子查询代替
  5. 使用union代替or,避免全表扫描

SQL语句的执行顺序

from --> where --> group by -- > having --> select --> order by

  • where和having的区别:
    1. jjhaving只能用在group by之后,对分组后的结果进行筛选(使用having的前提条件是分组)
    2. where肯定在having和group by之前
    3. where后的条件表达式里不允许使用聚合函数,having可以

NoSQL对比SQL

SQL:基于表,使用结构化语言也就是sql语句来定义和操纵数据。一方面功能非常强大,安全且适用于复杂查询;一方面是限制性的,SQL要求使用预定义模式来确定数据的结构,所有数据必须遵循相同的结构。
NoSQL:具有非结构化数据的动态模式,数据可以以多种方式进行存储:面向列、面向文档、基于图形等,组织为key-value存储。这种灵活性意味着:无需先定义其数据结构即可创建文档,每个文档都可以有自己独特的结构,语法可能因数据库而异,可以随时添加字段。

常见的SQL和NoSQL数据库:
SQL数据库:Mysql,Oracle,SQLServer
NoSQL数据库:MongoDB,Redis,HBASE等

Mysql和MongoDB比较:
Mysql:成熟稳定(庞大社区)、兼容所有主要平台、经济高效(开源免费)、可复制、分片(大多数SQL数据库无法进行分片,但MySQL可以)。适用于预定义数据结构和事务的应用程序。
MongoDB:动态模式、可扩展、速度快、灵活(添加新列或新字段)。适用于没有明确数据结构,或无法为数据库定义架构如实时分析等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 数据库的基本是概念名词解释: 数据库名词解释 元组:可以理解为表的每一行就是一个元组 候选码:若关系中的某一属性组...
    杰伦哎呦哎呦阅读 1,111评论 0 6
  • 1.数据库索引实现原理数据库的索引是在存储引擎层实现的,不同的存储引擎有不同的实现方法,索引一般指的是B-Tree...
    gskobe0811阅读 2,883评论 1 10
  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 2,914评论 0 8
  • Landlord Trouble M: You don't look good. Is something bot...
    慕炜菡容阅读 2,354评论 1 14
  • 今天的天气阴沉沉的,没有一丝风,天空都是灰白,灰白的,树叶似乎都静止了,一动不动,不知道是不是闷着一场透雨。今天不...
    浅笑安然N阅读 101评论 0 0