数据库小记

查询的执行顺序
1)from : 表名
2)where:条件过滤(条件执行顺序从右到左)
3)group by : 分组
4)having : 分组之后进行过滤。
5)select :执行完毕之后,显示内容。
6)order by : 根据查询的内容进行排序输出.

数据库范式
1NF 原子性:表中每列不可再拆分。
2NF 不产生局部依赖,一张表只描述一件事情。表中的每一列是完全依赖于主键的。
3NF 不产生传递依赖,表中每一列都直接依赖于主键。而不是通过其它列间接依赖于主键。

事务的特性(ACID)
隔离性:每个事务都是独立的互相隔离互不影响的
持久性:指一个事务一旦被提交,它对数据库的改变将是永久性的,哪怕数据库发生异常,重启之后数据亦然存在。
原子性:表中每列不可再拆分。原子性是指事务包装的一组sql(一组业务逻辑)是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:一个事务在执行之前和执行之后 数据库都必须处于一致性状态。
如果事务成功的完成,那么数据库的所有变化将生效。
如果事务执行出现错误,那么数据库的所有变化将会被回滚(撤销),返回到原始状态。
事务的成功与失败,最终数据库的数据都是符合实际生活的业务逻辑。一致性绝大多数依赖业务逻辑和原子性。

事务问题
脏读:指一个事务读取了另外一个事务未提交的数据。(非常危险) 注意脏读的前提是没有事务的隔离性
不可重复读:在一个事务内多次读取表中的数据,多次读取的结果不同。(update)
幻读:在一个事务内多次读取表中的数据,多次读取的结果不同。(insert/delete)
事务的隔离级别
read committed 脏读√ 幻读√ 不可重复读√
read uncommitted 脏读× 幻读√ 不可重复读√
repeatable read 脏读× 幻读√ 不可重复读×
serializable 脏读× 幻读× 不可重复读×
隔离级别安全和性能对比
安全性:serializable > repeatable read > read committed > read uncommitted
性能 : serializable < repeatable read < read committed < read uncommitted
常见数据库的默认隔离级别
MySql:repeatable read。
Oracle:read committed。
事务的传播行为
分为7种3大类

数据库删除小面试题

delete删除表中的数据时没有加where 条件,会删除表中的所有数据,它与truncate 有什么区别?
1.DELETE
 DML语言
数据还可以找回来,恢复回来
 可以有条件的删除。DELETE FROM 表名 WHERE 条件

2.TRUNCATE TABLE
 DDL语言
数据不可以恢复
 先将整个表删除,再重新创建
 删除速度比delete快。
delete from person; 和 drop table person; 有什么区别:
delete from person; 把person表中的所有数据全部删除,但是person的表还存在。还可以向表中继续添加数据。
drop table person; 把person数据表从数据库中删除。表已经不存在,不能再向表中添加数据

数据库索引:

概念:
简单的说,相当于一本书的目录。(数据库中的索引相当于字典的目录(索引)),它的作用就是提升查询效率。

特性:
一种独立于表的模式(数据库)对象, 可以存储在与表不同的磁盘或表空间中。
索引被删除或损坏, 不会对表(数据)产生影响, 其影响的只是查询的速度。
索引一旦建立, Oracle 管理系统会对其进行自动维护, 而且由 Oracle 管理系统决定何时使用索引. 用户不用在查询语句中指定使用哪个索引。
在删除一个表时, 所有基于该表的索引会自动被删除。
如果建立索引的时候,没有指定表空间,那么默认索引会存储在所属用户默认的表空间.
作用:
通过指针(地址)加速Oracle 服务器的查询速度。
提升服务器的i/o性能(减少了查询的次数);
原理
创建索引时会自动分配一个空间,基于创建索引的字段对表中的数据进行分组(保存的是rowid),当再次发起请求时oracle会判断查询条件的字段是否有索引,如果有就通过保存的rowId进行定位

主键默认有索引;对于经常查询排序分组的id增加索引
创建语法:create index 索引名 on 表名 (字段名,字段名)
create index i_staff on staff (empno);
create index i_agent on agent (empno, start_date);
CREATE INDEX mytable_categoryid ON mytable (category_id);
CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);

删除索引的语句:drop index 索引名
drop index I_staff;

sql优化及使用注意事项
引用了 https://www.cnblogs.com/wanggd/p/3240998.html
引用:https://blog.csdn.net/piaoboyijianke1/article/details/45050223

数据库优化:
1.字段的属性大小要符合具体的业务情况,数据库中的表性能越高,合理应用char跟varChar,比如邮编用char类型足够了,尽量把字段设置为notNull,这样以后查询
的时候,数据库就不用去比较null值,不要滥用bigint。
2.使用多表查询时使用内连接或者外连接代替子查询;使用子查询时需要把内层查询结果当作外层查询的比较条件,执行子查询时需要创建临时表,查询完毕再删除这些表
这样已经影响了效率;在关联很多张表并且数据量很大的情况下,需要将这几张变得数据全部查询一遍这需要耗费大量时间,而连接查询并不用创建临时表
3.对一些值有限的列用0123来表示不过要写好注释
4.将一些查询比较频繁的字段加上索引,varchar的类型在建立索引的时候最好指定好长度,查询有多个条件时,优先使用具有索引的条件,像LIKE条件这样的模糊搜索对于字段索引是无效的,
需要另外建立关键词索引来解决;请尽量不要在数据库层面约束表和表之间的关系,这些表之间的依赖应该在代码层面去解决
5.一张表的某些字段值比较大的话应该拆分成多张表(垂直拆分,水平拆分)一张表的某些字段访问查询量比较高也应该分表
6.优化查询语句:请尽量指定需要查询的列,不要使用select *如果不指定,一方面会返回多余的数据,占用宽带等;当只要一行数据时,请使用LIMIT 1,如果数据过多,
请适当设定LIMIT,分页查询;多条件查询时,请把简单查询条件或则索引列查询置于前面
7.添加缓存:使用redis等缓存,还有本地文件缓存等,可以极大地减少数据库查询次数。缓存这个东西,一定要分析自己系统的数据特点,适当选择。
对于一些常用的数据,比如配置信息等,可以放在缓存中
可以在本地缓存数据库的表结构
缓存的数据一定要注意及时更新,还有设置有效期
增加缓存务必会增加系统复杂性,一定要注意权衡
8.数据库引擎:mysql比较常用的数据库引擎有两种,一种是innodb、一种是myisam 之所以mysiam快,是因为他的数据存储结构、索引存储结构和innodb不一样的,
mysiam的索引结构是在内存中存的 ;mysiam也有弱点,那就是他是表级锁,而innodb是行级锁,所以,mysiam适用于一次插入,多次查询的表,或者是读写分离中的读
库中的表,而对于修改插入删除操作比较频繁的表,就很不合适

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值