sql唯一索引异常_MySQL系列 一 引擎和索引

MySQL都有哪些引擎?

常见的有三种,InnoDBMyISAMMEMORY

InnoDB有以下的特性:

  • 支持事务,支持回滚等
  • 支持外键
  • 支持并发性
  • 支持行级锁
  • 不支持全文索引

InnoDB读写效率相对较差,数据存储占用空间大。

MyISAM特性有

  • 不支持事务
  • 不支持外键
  • 不支持并发
  • 仅支持表级锁
  • 支持全文索引

MyISAM占用空间小,处理速度快。

MyISAM自己维护了计数器,因此对于 select count(*) 查询速度更快。

MEMORY的数据全部放在内存中,速率最快,关机和重启均会丢失数据。

MySQL的索引类型?

以常见的InnoDB为例:

  • 聚簇索引(聚集索引):和数据存储在一起(同一个B+树中)
  • 唯一索引
  • 联合索引
  • 普通索引

后三者称为“二级索引”,它记录的是主键,而不是数据存储的位置。

InnoDB的四大特性?

1、插入缓冲(insert buffer)

每次的插入操作会放入缓冲池中,然后按照一定的频率进行合并操作,再进行IO操作。

主要用于提升IO性能。但只对聚集索引(唯一索引)无效。

2、二次写(double write)

b405d16bc6fd9c7a0fa008e1da799703.png
图片来源见上图水印

如上图所示,InnoDB将数据从缓存写入磁盘时,分成以下几步:

  1. 将Page(数据页)汇总到缓存中
  2. 写入硬盘上的共享表空间。这里性能好
  3. 写入硬盘的目标位置
  4. 如果第三步失败或发生异常,则会从共享表空间中恢复,再次写入

3、自适应哈希索引(ahi)

如果发现某二级索引被频繁访问时,会将该索引放入hash缓存中。hash查找非常快,因此可以提高索引的效率。

4、预读(read ahead)

有两种预读算法:

  • 线性预读:即根据前面访问的地址继续向后读取。
  • 随机预读:同一个数据块的不同page被读取时,会把该数据块的剩余page一并读入缓存。不过该方式已经在5.5中被废弃,因为比较复杂和不稳定。

InnoDB有哪些日志?

  • 错误日志:记录出错的信息,也记录警告信息或正确信息
  • 查询日志:记录所有对数据库的请求,无论是否被正确执行
  • 慢查询日志:根据设置的阈值,将超时的sql记录在此
  • 二进制日志:记录对数据库执行更改的所有操作
  • 中继日志:也是二进制文件,slave用来同步和恢复
  • 事务日志:记录事务执行。事务执行时会先写日志,事务提交后将日志缓冲写入磁盘

二进制日志(binlog)录入格式有哪些?有什么区别?

大致有三种方式:StatementRowMixedlevel

Statement:记录每一条会修改数据的sql。

优点:不需要记录每一行的具体变化,日志量少,性能高。

缺点:为了让slave能正确执行,还必须记录执行时的相关信息。而且UUID()等语句会产生一致性问题。

Row:不记录sql语句的上下文信息,只记录哪条记录被修改。

优点:记录内容简单,准确性高。因为记录的是最终被修改的值;

缺点:记录的量非常大。比如表结构被修改后,每一行的数据都会被记录。

Mixedlevel:上述两种的混合模式。避开了各自的缺点,不同的操作使用不同的方式记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值