数据库——索引、事务、存储引擎

索引

索引是对某个字段进行排序的一种方式,对表中某个字段创建索引会创建另一种数据结构(二叉树),数据结构中保存着字段的值,而该值又指向与他相关的记录,这种数据结构是经过排序的,可以进行二分查找

创建索引

alter table 表名 add index(列名)

索引分类

  • 主键索引(primary)
    • 唯一性:一个表中只能有一个主键索引
    • 效率高:因查询效率高,为一个表中只能有一个索引
    • 创建主键索引的列的值不能为空null,且不能重复
    • 主键索引的类型基本都为int型
  • 唯一索引(unique)
    • 不唯一:一个表中可创建多个唯一索引
    • 高效性:查询效率高
    • 创建唯一索引的列的值不能重复(与主键该性值的区别在于可以为null)
    • 若在唯一索引的条件加上not null,那么就等价于主键索引
  • 普通索引(index)
    • 不唯一:一个表中可创建多个普通索引
    • 可重复:创建普通索引的列的值可重复(若列中元素有重复,且依然要添加索引,就添加普通索引)
  • 全文索引
    • 文中有大量文字检索的时候使用全文索引

创建索引的原则

  • 频繁查询的字段
  • 经常做表连接的属性
  • 唯一性太差的不要创建索引(比如男女性别等)
    因为查询之后会返回大量的重复数据
  • 频繁更新的字段不要创建索引
    因为索引的创建需要使用数据结构来维护,频繁更新意味着数据结构也要跟着改变,这样损耗很大
  • 不会出现where语句的不要创建索引
    因为在查询的时候是使用where语句来过滤条件的
    还有一些其他的博客https://blog.csdn.net/zljjava/article/details/41985933

索引的一些注意事项

  • 创建索引需要占用磁盘空间
  • 索引是一种以空间换时间的做法
  • 当添加一条索引的时候,还要维护数据结构(二叉树)的结构,对速度有一定的影响

事务

其实事务总结一句话就是——一荣俱荣,一损俱损
事务是一组dml(数据库操纵语言)语句组成,这些语句在逻辑上存在相关性,这组dml语句要么全部成功,要么全部失败

事务的隔离级别

  • 读未提交(read uncommited)
    会发生脏读,不可重复读,幻读的情况
  • 读已提交(read committed)
    不会发生脏读,会发生不可重复读,幻读的情况
  • 可重复读(repeatable read)——默认隔离级别
    不会发生脏读,不可重复读,会发生幻读的情况
  • 可串行化(serializable)
    不会发生脏读,不可重复读,幻读的情况
    事务隔离级别

事务语句

  • 创建事务
start transation;
  • 设置保存点
savepoint 保存点名
  • 回滚
rollback to 保存点名
  • 提交事务
commit;
  • 设置事务隔离级别
set session transaction isolation level 设置的事务隔离级别
  • 查看事务隔离级别
select @@tx_isolation

名词解释

  • 脏读
    个客户端(事务)会读取到另外一个客户端(事务)没有提交的修改数据。
  • 不可重复读
    同一个查询在同一个事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读。
  • 幻读
    同一个查询在同一个事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。

事务的特性ACID

  • A 原子性(Atomicty)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • C 一致性(Consistency)
    事务必须使数据库从一个一致性状态变到另外一个一致性状态。
  • I 可重复读(Isolation)
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • D 可串行化(Durability)
    持久性是指一个事务一旦被提交,它对数据库中的数据的修改就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

数据库的存储引擎

数据库有四种存储引擎MyISAM、Memory、InnoDB、Archive
下面主要说一下MyISAM和InnoDB这两个存储引擎

MyISAM和InnoDB的区别

  • 事务
    • MyISAM是非事务安全型的
    • InnoDB是事务安全的,并且默认开启自动提交且合并事务一同提交,这样减少数据库多次提交导致的开销,提高了性能

    • MyISAM的锁是表级的锁
    • InnoDB支持行级锁
  • 全文索引
    • MyISAM支持全文索引
    • InnoDB不支持全文索引
  • 查询效率
    • MyISAM性能高于InnoDB
  • 外键
    • MyISAM不支持外键
    • InnoDB支持外键
  • count
    • MyISAM有表的总行数
    • InnoDB只能遍历
  • 保存格式
    • MyISAM是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
  • 安全性
    • InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表。
  • MyISAM索引和数据分离,InnoDB在一起,MyISAM天生非聚簇索引,最多有一个unique的性质,InnoDB的数据文件本身就是主键索引文件,这样的索引被称为“聚簇索引”

其他更多见博客:https://www.cnblogs.com/y-rong/p/8110596.html

MyISAM与InnoDB的选择

  • MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
  • InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

猜你喜欢

转载自blog.csdn.net/L_X_Y_HH/article/details/81774316