MySQL的优化,三大范式和事务的四大特性

发布时间 2023-09-03 20:56:49作者: xietingweia
优化
  • 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

  • 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

  • 3.应尽量避免在 where 子句中使用not in 或or或 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。

  • 4.使用连接(JOIN)来代替子查询(Sub-Queries)

  • 5.事务

    • 作用是:要么语句块中每条语句都操作成功,要么都失败。可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。
    • 事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。
  • 6.使用外键

  • 7.使用in和not in要慎用。

  • 8.尽量不要使用select *来查询。

  • 9.避免频繁的创建和删除临时表,以减少系统表的资源消耗

    • 建立索引的优点:

      • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

      • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

      • 可以加速表和表之间的连接。

      • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

    • 建立索引的缺点:

      • 建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引。

      • 更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性。

数据库设计三大范式
  • 1.所有的域必须是原子的,字段是独立的,不可分割的
  • 2.在1的基础上,每一列和主键相关,而不是和主键部分相关
  • 3.确保每一列必须与主键直接相关,而不是间接相关,不具备传递性。
事务的四大特性(ACID)
  • 1:原子性(Atomicity)。事务是一个不可分割的整体,事务开始的操作,要么全部执行,要么全部不执行。
  • 2:隔离性(Isolation)。同一时间,只允许一个事务请求同一组数据。不同的事务彼此之间没有干扰。
  • 3:一致性(Consistency)。事务开始前和结束后,数据库的完整性约束没有被破坏 。
  • 4:持久性(Durability)。事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
并发事务产生的问题:
  • 1:脏度,一个事务读取到另一个事务未提交的数据
  • 2:不可重复读:一个事务在读取范围内多次读取数据不一致,另一事务对数据进行更改并提交;
  • 3:幻读:一个事务在读取范围内多次读取数据发现不一致,另一个事务添加或删除数据并提交。
隔离性的四种级别
  • 1: read uncommitted。事务A对数据进行修改,但未提交。此时开启事务B,在事务B中能读到事务A中对数据库进行的未提交数据的修改。PS:脏读
  • 2 :read committed。修改前和修改后两次读的结果是不一样的。(这种方式称为不可重复读。)PS:可避免脏读、不可重复读的发生。
  • 3 :repetition read可重复读。事务A对数据进行修改,但未提交,此时开启事务B,在事务B中不能读到事务A对数据库的修改。在事务A提交对数据库修改时,此时在事务B中,仍不能读到事务A对数据库的修改。(这种方式称为可重复读)但此时有一个弊端,比如我们在事务A中对数据库增加一条数据,id 为 n ,这时候我们在事务B中查询数据,此时查不到id为n的数据。但当我们在事务B中增加id为n的数据时,系统会提示id为n的数据已经存在,我们添加失败。但此时此刻,我们在事务B中仍不能查询到id为n的数据。这种方式存在一个幻读的概念。举个例子,(系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后关闭事务发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。)PS:可避免脏读、不可重复读的发生。
  • 4 :serializable串行化。在开启事务A时,会产生锁表,此时别的事务会等待,等事务A结束时才会开启。PS:可避免脏读、不可重复读、幻读的发生。