数据库总结

Mysql

Mysql 的存储引擎

1、InnoDB存储引擎,
默认事务型引擎,最重要最广泛的存储引擎,性能非常优秀。
数据存储在共享表空间,可以通过配置分开。也就是多个表和索引都存储在一个表空间中,可以通过配置文件改变此配置
对主键查询的性能高于其他类型的存储引擎
内部做了很多优化,从磁盘读取数据时会自动构建hash索引,插入数据时自动构建插入缓冲区
通过一些机制和工具支持真正的热备份
支持崩溃后的安全恢复
支持行级锁
支持外键

2、MyISAM存储引擎,
5.1版本前,是默认存储引擎。
拥有全文索引、压缩、空间函数。
不支持事务和行级锁、不支持崩溃后的安全恢复。
表存储在两个文件,MYD和MYI。
设计简单,某些场景下性能很好,例如获取整个表有多少条数据,性能很高。
全文索引不是很常用,不如使用外部的ElasticSearch或Lucene

两者最大的区别就是,InnoDB支持事务处理与外键和行级锁,MylSAM 不支持,但是支持全文索引。InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table 时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可

MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构。这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引,所以必须有主键,如果没有显示定义,自动为生成一个隐含字段作为主键,B树内部节点含有一定数量的键,这些键标识了子节点的最小值或者叫范围,在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的子节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败,B树尽量减少了高度,提高了查询效率。这样可以减少磁盘IO.B+树增加了叶子结点的顺序访问指针,顺着节点和指针顺序遍历就可以一次性访问到所有需要的数据节点,极大提到了区间查询效率。

InnoDB 表是基于聚簇索引建立的。因此InnoDB 的索引能提供一种非常快速的主键查找性能。不过,它的辅助索引(Secondary Index, 也就是非主键索引)也会包含主键列,所以,如果主键定义的比较大,其他索引也将很大

MySQL锁机制

表级锁和行级锁,InnoDB:支持行级锁和表级锁,默认是行级锁 ,MyISAM:这两个存储引擎都是采用表级锁

独占锁和共享锁,独占锁也就是写锁,共享锁也就读锁。

行级锁:行级锁分为共享锁和排它锁。行级锁是Mysql中锁定粒度最细的锁。InnoDB引擎支持行级锁和表级锁,只有在通过索引条件检索数据的时候,才使用行级锁,否就使用表级锁。行级锁开销大,加锁慢,锁定粒度最小,发生锁冲突概率最低,并发度最高

表级锁:表级锁分为表共享锁和表独占锁。表级锁开销小,加锁快,锁定粒度大、发生锁冲突最高,并发度最低

MySQL事务处理

事务的四个特性ACID,原子性,一致性,隔离性,持久性(永久性)。事务的隔离级别分为:
串行化:最严格的
可重复读:导致幻读(一个事务过程中,另一个事务在前一个事务未结束时添加或删除了数据,以后会发生感觉操作不完全或者前后读取不一致的幻觉,与不可重复读的区别就是,强调改变数据行数)
读已提交:导致不可重复读(一个事务过程中,另一个事务对数据做了修改操作,导致两次读取的数据不一致),幻读
读未提交:导致脏读,不可重复读,幻读(未提交的事务被其他事务读取到)。

InnoDB 使用B+树的好处

  1. 文件很大,不可能全部存储在内存中,故要存储到磁盘上
  2. 索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/+Tree,还跟磁盘存取原理有关)。
  3. 局部性原理与磁盘预读,预读的长度一般为页(page)的整倍数,(在许多操作系统中,页得大小通常为4k)
  4. 数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,(由于节点中有两个数组,所以地址连续)。而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性

InnoDB 和MylSAM 的区别

InnoDB支持事务,MyISAM不支持;
InnoDB数据存储在共享表空间,MyISAM数据存储在文件中;
InnoDB支持行级锁,MyISAM只支持表锁;
InnoDB支持崩溃后的恢复,MyISAM不支持;
InnoDB支持外键,MyISAM不支持;
InnoDB不支持全文索引,MyISAM支持全文索引;

varchar和text的区别

varchar可指定字符数,text不能指定,text 最大64Kb,varchar 最大也是64Kb
text类型不能有默认值。
varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引几乎不起作用。
查询text需要创建临时表

数据库的三大范式

第一范式:字段是最小的的单元不可再分
第二范式:满足第一范式,表中的字段必须完全依赖于全部主键而非部分主键
满足第二范式,非主键外的所有字段必须互不依赖

SQL优化

where 语句后的条件,用到索引的,过滤最多的放在前面
使用union all 替代union ,防止去重操作
使用查询缓存,尽量使用可开启缓存的SQL语句
当只要一行数据时使用 LIMIT 1
索引优化
在Join表的时候使用的连接字段一定是索引字段
避免 SELECT *,需要什么取什么
字段尽量使用非空
条件尽量用in 代替or
子查询优化,子查询转化为关联查询,尽量不使用关联查询和子查询
反范式设计,适当冗余,提高查询效率

查询中哪些情况不会用到索引

全模糊匹配
复核索引的非顺序查询
查询条件的数据计算或者函数引用
OR连接非索引字段

数据库索引底层是如何实现的,InnoDB 为什么要用b+tree 索引

文件很大,不可能全部存储在内存中,故要存储到磁盘上,计算机在读写文件时会以页为单位将数据加载到内存中,b+tree 可以减少查询时的磁盘IO
局部性原理与磁盘预读,预读的长度一般为页(page)的整倍数,数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入
B 树能够在非叶节点中存储数据,但是这也导致在查询连续数据时可能会带来更多的随机 I/O,而 B+ 树的所有叶节点可以通过指针相互连接,能够减少顺序遍历时产生的额外随机 I/O

Mysql 主从同步的实现原理

基于Binglog ,从库同步主库的binglog到自己的中继日志中,再讲中继日志回放到数据之上

Mysql InnoDB 是怎么用 b+tree 的

Mysql 使用B+Tree 作为数据和索引结构。b+tree 叶子节点存储所有数据,且有序,叶子节点含有一个指向下一个叶子节点的顺序指针可以加速访问,所有的查询只遍历叶子节点就行
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针

Mybatis

#{}和${}的区别是什么

  • #{}解析传递进来的参数数据
  • ${}对传递进来的参数原样拼接在SQL中
  • #{}是预编译处理,${}是字符串替换
  • 使用#{}可以有效的防止SQL注入,提高系统安全性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值