本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. 数据库的控制功能
数据库系统运行的基本工作单位是事务,事务具备以下特性:
- 原子性:事务是数据库的逻辑工作单位,所有操作在数据库中要么全做,要么全部做。
- 一致性:事务的执行使数据库从一个一致性状态变成另一个一致性状态。
- 隔离性:各个事务之间的执行不能互相干扰。
- 持续性:一旦事务提交,对数据库的改变是永久的,即使系统出现故障时也是如此。
事务通常以BEGIN TRANSACTION语句开始,以COMMIT或ROLLBACK语句结束。COMMIT称为事务提交,表示事务执行结束,把事务对数据库的修改写入磁盘。ROLLBACK称为事务回滚,表示事务执行不保存结束,即事务对数据库的修改不写入磁盘。
1.1 并发控制
在多个用户系统中,多个事务可能同时对同一个数据进行操作,则称为并发操作。
1.1.1 并发操作的问题
并发操作带来的主要问题是:
- 丢失更新:T1事务的提交结果破坏了T2事务提交的结果,T2修改丢失。
- 读过时数据:事务T1读取某一数据,事务T2读取并修改了同一数据后,T1再次读取该数据,造成连续读取两次的结果不一致。
- 读脏数据:事务T1修改某一数据,事务T2读取同一数据,而T1突然撤销操作,导致T2读取的数据就是不正确的数据。
1.1.2 解决
- 常用的解决方法是加锁。封锁协议有简单的,复杂的。其中简单加锁方式对所有的读写操作都加锁。在对效率要求不高情况下,比较方便。复杂方式,如可以读写用不同的锁提高效率,有兴趣可自行查找资料。加锁注重粒度的大小,封锁粒度大则并发性低,但开销小;粒度小则并发性高,同时开销大。需综合考虑选取适当的封锁粒度。
- 在嵌入式产品中,并发操作较少,可采用其他方式避免并发操作。例如将事务操作压入队列,按顺序进行处理等。
- 程序线性处理,不使用并发操作,则无需对事务添加保护措施。
1.2 备份与恢复技术
嵌入式产品与硬件相关,极其容易出现硬件问题导致数据丢失现象。或者更换设备需进行数据库迁移。
1.2.1 数据备份
- 定期将数据库备份到另一个位置。(1)从一个磁盘复制到另一个磁盘保存;(2)定期将数据库上传到服务器;
- 日志文件。记录对数据库的任何操作,并将日志文件结果保存在独立的文件中。根据日志内容记录的操作,再次顺序执行即可恢复最新数据库。
2. 数据库性能
2.1 sql的性能优化
大部分数据库效率的问题都是由于sql语句编写不善引起的,所以sql优化十分重要。为了编写更好的sql语句,不仅应按照规范来编写,而且还要进行多次的性能测试,不断调整。
2.2 查询优化
- 把数据、日志、索引放在不同的存储设备上,增加硬件读取速度,减少同时访问硬件的可能。
- 分割表,减少表的尺寸。
- 建立索引,优化索引,限制查询结果的数据量。
- 注意使用 DISTINCT 和 UNION,它会使得查询变慢。
- 在 IN 后面值的列表中,根据出现的频率,从高频率到低频率依次排放。
- 不要在一句话里多次使用相同的函数,浪费资源,将结果放在变量里再调用。
等等,关于sql优化的方法太多,网上也有不少资料,各位可以自行查找资料,这里转一篇较为全面的文章: sql优化的N种方法_持续更新_王会举的博客-CSDN博客_sql优化