数据库

1.    常见的数据库优化手段:

a.    百万级数据库优化:对查询进行优化,要尽量避免全表扫描,考虑在where及order by涉及的列上建立索引。避免在where子句中进行null值判断,避免使用!=或者<>,or,in,not in,like操作符,这些操作符会导致全表扫描。对于大的delete或者insert语句,最好批量提交SQL语句,因为这两个操作会锁表,别的操作无法进来,表锁上一段时间累积的进程/线程会让你的服务器崩溃。

b.    

这个优化法则归纳为5个层次:

c.    减少数据访问(减少磁盘访问)比如创建并使用正确的索引,

d.    返回更少数据(减少网络传输或磁盘访问)比如数据分页处理,只返回需要的字段

e.    减少交互次数(减少网络传输)比如一些批量提交的接口batchDML,当一些ID查询数据库记录,可以采用ID INLIST (select * from mytable where id in(:id1,id2,...,idn);),

f.     减少数据库服务器CPU开销(减少CPU及内存开销)

g.    利用更多资源(增加资源)比如数据库并行处理,客户端多进程访问。

2.    索引

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储机构,它是某个表中一列或若干列值得集合和相应得指向表中物理标识这些值得数据页的逻辑指针清单。索引的作用相当于图书的目录,它可以根据目录中的页码快速找到所需的内容。索引的优点:建立索引的列可以保证行的唯一性,生成唯一的rowid;建立索引可以有效缩短数据的检索时间;建立索引可以加快表与表之间的连接;为用来排序或者是分组的字段添加索引可以加快分组和排序顺序。索引的缺点:创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大;创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大;创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大;会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长。什么样的表要建立索引?总的来说就是数据量大,经常进行查询操作的表要建立索引;表中字段建立索引应该遵循几个原则:越小的数据类型通常更好,简单的数据类型更好,尽量避免NULL,对唯一的字段;表与表连接用于多表联合查询的约束条件的字段应当建立索引;用于排序的字段可以添加索引,用于分组的字段应当视情况看是否需要添加索引;添加多列索引的时候,对应的多条件查询可以触发该索引的同时,索引最左侧的列的单条件查询也可以触发;如果有些表注定只会进行查询所有,也就没有必要添加索引,因为查询全部只能进行全量搜索即扫描全表。

3.    数据库连接池

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从缓冲池中取一个,使用完毕后再放回去。优势:资源重用,由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销,也增进了系统运行的平稳性;更快的系统相应速度;新的资源分配手段;统一的连接管理,避免数据库连接泄露。

4.    事务:

我们在实际业务场景中,经常会遇到数据频繁修改读取的问题在同一时刻,不同的业务逻辑对同一个表数据进行修改,这种冲突很可能造成数据不可挽回的错乱,所以我们需要对数据进行管理。事务必须服从ACID原则。ACID指的是原子性、一致性、隔离性、持久性。事务其实就是一系列指令的集合。

5.    原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。

一致性:事务的执行使数据从一个一致性状态转换为另一个一致性状态,但是对于整个数据的完整性保持稳定。

隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该指存在于该事务中,对外界不存在任何影响。只有在事务确定提交后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。

持久性:当事务正确完成后,它对于数据的改变是永久性的。

6.    事务隔离性:https://blog.csdn.net/qq_33290787/article/details/51924963

当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作以保证各个线程获取数据的准确性。数据库事务的隔离级别:

a.    Read uncommitted,读未提交,就是一个事务可以读取另一个未提交事务的数据。当一个事务读取另一个未提交事务的数据时会发生脏读。通过Read committed读提交能解决脏读问题。

b.    Read committed读提交,就是一个事务要等另一个事务提交后才能读取数据。可以解决脏读问题。但是在一个事务范围内两次查询操作之间如果另一个事务进行UPDATE操作,这就会导致两次相同的查询操作的结果不一样(比如卡里面看着有钱,但当扣款再次查询时发现没钱了已经),这就是不可重复读。Repeatable read可以解决不可重复读问题。

c.    Repeatable read重复读,就是在开始读取操作时,不再允许修改操作。重复读可以解决不可重复读问题,不可重复读对应的是修改,即UPDATE操作,但是可能还会有幻读问题,因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

幻读:当某事务打印记录时,另一事务进行了INSERT操作,使打印出来的事务与看到的不一样。Serializable序列化可以解决幻读问题。

d.    Serializable是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

大多数数据库默认的事务隔离级别是Read committed,比如Sql Server,Oracle。Mysql的默认隔离级别是Repeatableread。

7.    MySQL的两种查询引擎区别,各自适用的场景:

MYISAM不支持事务,不支持外键,表锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描。

INNODB支持事务,支持外键,行锁,查表总行数时,全表扫描。

8.    索引有B+索引和hash索引,各自的区别:

Hash索引,等值查询效率高,不能排序,不能进行范围查询。

B+索引,数据有序,范围有序。

B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。

哈希索引就是采用一定的哈希算法,把键值换成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立即定位到相应位置。

a.    如果是等值查询,那么哈希索引有绝对优势,因为只需经过一次算法即可找到相应的键值。

b.    如果是范围查询索引,这时候哈希索引就毫无用武之地了,因为原先有序的键值,经过哈希算法后有可能变成不连续的了,就没办法再利用索引完成范围查询。

c.    同理哈希索引也没办法利用索引完成排序,以及like’xxx%’这样的部分模糊查询。

d.    B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大。

B+树索引结构适用于绝大多数场景,因为在大多数范围查询、排序、分组等。

9.    索引的优缺点,什么时候使用索引,什么时候不能使用索引:

索引最大的好处是提高查询速度,缺点是更新数据时效率低,因为要同时更新索引,对数据进行频繁查询建立索引,如果要频繁更改数据不建议使用索引。

10.  Explain命令:

我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还需要知道该SQL的执行计划,比如时全表扫描还是索引扫描,这些都需要通过Explain去完成。

11.   Varchar和Char的使用场景:

用来存储字符,varchar适用于字符长度经常变的,char适用字符长度固定的。

12.   三大范式:

第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式,满足第一范式是关系模式规范化的最低要求。

第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R得每一个候选关键属性,称R满足第二范式。

第三范式:设R是一个满足第一范式条件得关系模式,X是R得任意属性集,如果X非传递依赖于R得任意一个候选关键字,称R满足第三范式。即每个属性都跟主键有直接关系而不是间接关系。

13.  关系型数据库与非关系型数据库区别:、

关系型数据库是指采用了关系模型来组织数据库,最大特点就是事务得一致性。

优点:a.容易理解:二维表结构是非常近逻辑世界一个概念,关系模型相对网状;b.使用方便:通用得SQL语言使得操作关系数据库非常方便;c.易于维护:丰富的完整性大大减低了数据冗余和数据不一致的概率;d.支持SQL可用于复杂的查询。

缺点:a.为了维护一致性所付出的巨大代价就是读写性能比较差;b.固定的表结构;c.不支持高并发读写需求;d.不支持海量数据的高效率读写。

非关系型数据库的特性:1.使用键值对存储数据;2.分布式

优点:无需经过sql层的解析,读写性能很高;基于键值对,数据没有耦合性容易拓展;存储数据的格式:nosql的存储格式是key,value形式。

缺点:不支持事务,不支持sql.

14.  数据库中的join的inner join,outer join,cross join.

Left join(左连接)返回左表中的所有记录和右表中联结字段相等的记录。

Right join(右连接)返回右表中的所有记录和左表中联结字段相等的记录。

Inner join(等值连接)只返回两个连接表中连结字段相等的行。

15.  最左匹配原则:

最左匹配原则是针对索引的。

两个字段(name,age)建立联合索引,如果where age=12这样的话没有利用到索引。如果是where name=’xxx’ and age=’xxx’就利用到索引了,如果name和age调换位置也会利用到索引,因为优化器会进行优化。

16.  锁:

并发控制一般采用三种方法,分别是乐观锁,悲观锁和时间戳。

乐观锁就是认为一个用户读取数据的时候,别人不会去写自己所读的数据;

悲观锁相反,觉得自己读数据的时候,别人可能刚好在写自己刚读的数据,是基于数据库机制实现的,比如在使用select子句的时候加上for update那么直到改子句的事务结束为止,任何应用都无法修改select出来的数据;

时间戳就是不加锁,通过时间戳来控制并发出现的问题。在数据库中单独加一列时间戳,比如“TimeStamp”,每次读出来的时候把该字段也读出来,当写回去的时候把该字段加1,提交之前,跟数据库的该字段比较一次,如果比数据库的值大的话就允许保存,负责不允许保存。

悲观锁分为排他锁(写锁)和共享锁(读锁)。

行级锁是一种排他锁,防止其他事务修改此行。使用insert,update,delete,select语句会自动应用行级锁,使用commit,rollback语句会释放锁。

表级锁分为:行共享(禁止排他锁定表)、行排他(禁止使用排他锁和共享锁)、共享锁(锁定表,对记录只读不写,多个用户可以同时在同一表上应用此锁)、共享行排他(比共享锁更多的限制,禁止使用共享锁及更高的锁)、排他(限制最高的表锁,仅允许其他用户查询该表的行,禁止修改和锁定表)。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值