跳转至

其它

索引 key

  • 普通索引:普通索引只是提升数据检索的速度,并不对字段的唯一性进行约束
  • 唯一索引:唯一索引相当于给普通索引加了一个约束,可以为NULL,目的是保证字段的正确性,比如身份证号等
  • 主键索引

把表中某列的值存储到某种数据结构中,就叫索引

最常用的数据结构为:B-Tree

优点

  • 提高数据检索效率,降低数据库IO成本
  • 通过索引对数据进行排序,降低CPU消耗

缺点

  • 占用空间
  • 降低了表更新的速度
  • 建立最优索引需要花时间研究

适合建立索引的字段:主键,外键,频繁作为查找或排序的字段

索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高,像性别这种列有索引反而会降低效率,这种情况下大数据中会使用分组的概念

事务 transaction

https://www.liaoxuefeng.com/wiki/1177760294764384/1179611198786848

数据库事务是对数据库进行一系列操作的序列,这些操作要么全部执行,要么全不执行,是一个不可分割的集合。

具有ACID这4个特性:

  • A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全都执行,要么全不执行;
  • C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
  • I:Isolation,隔离性,如果有多个事务并发执行,每个事务各自读、写的数据互相独立,不会彼此影响(与并发密切相关);
  • D:Duration,持久性,即事务完成后,对数据库数据的修改被持久化存储,不会再因为任何原因而导致其修改的内容被撤销或丢失。

一致性是目的,AID是手段

SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致的情况

20211103154025

  • 脏读,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据。
  • 不可重复读,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。
  • 幻读,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。
-- 指定隔离级别,MySQL中如果使用InnoDB,默认的隔离级别是Repeatable Read。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;  -- 开启事务
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;  -- 提交事务
ROLLBACK;  -- 回滚事务

20211103162720

性能优化

I/O 是 DBMS 最容易出现瓶颈的地方,可以说数据库操作中有大量的时间都花在了 I/O 上。

对索引字段做函数操作,或有隐式类型转换涉及函数操作,或有隐式字符编码转换,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能,导致全索引扫描。

因此用explain+SQL语句分析一下,是一个很好的习惯,它可以模拟优化器执行SQL查询语句。

  • 尽量只查询所需要的列;
  • 当你知道只有 1 条记录的时候,就可以使用LIMIT 1来进行约束