VARBINARY 在插入不会去填补0x00字节, 查询的时候也不会丢弃任何字节, 在比较的时候, 所有的字节都是有效的,
区别和选择
如果需要存储的字符串的长度跟所有值的平均长度相差不大, 适合用 CHAR, 如MD5; 对于经常改变的值, CHAR 优于 VARCHAR, 原因是固定长度的行不容易产生碎片.
对于很短的列, CHAR 优于 VHARCHAR, 原因是 VHARCHAR 需要额外一个或两个字节存储字符串的长度.
BINARY 和 VARBINARY 是和编码无关的存储, 适合存储二进制数据.
MySQL 有哪些存储引擎? 都有什么区别?
MySQL 几种存储引擎的应用场景?
MyISAM
- 较高的插入和查询速度, 不支持事务
- 如果数据表主要用来插入和查询记录, 则MyISAM能提供较高的处理效率
InnoDB
事务型数据库的首选引擎, 支持事务安全表 ACID, 支持行锁定和外键, 是默认的引擎
如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力, 并要求实现并发控制, InnoDB是一个好的选择
InnoDB 和 MyISAM之间的区别:
- InnoDB支持事务, 而MyISAM不支持事务
- InnoDB支持行级锁, 而MyISAM支持表级锁
- InnoDB支持MVCC, 而MyISAM不支持(MVCC 多版本并发控制, 保证InnoDB的事务隔离级别下一致性读操作)
- InnoDB支持外键, 而MyISAM不支持
MEMORY/HEAP
存储引擎将表中的数据存储到内存中, 为查询和引用其他表数据提供快速访问
如果只是临时存放数据, 数据量不大, 并且不需要较高的数据安全性, 可以选择将数据保存在内存中的Memory引擎, MySQL中使用该引擎作为临时表, 存放查询的中间结果, 数据的处理速度很快但是安全性不高.
Archive
只允许INSERT和SELECT操作. Archive支持高并发的插入操作, 但是本身不是事务安全的. Archive非常适合存储归档数据, 如记录日志信息可以使用Archive
MyISAM 和 InnoDB 的区别
第一个重大区别是InnoDB的数据文件本身就是索引文件. MyISAM索引文件和数据文件是分离的, 索引文件仅保存数据记录的地址. 而在InnoDB中, 表数据文件本身就是按B+Tree组织的一个索 引结构, 这棵树的叶节点data域保存了完整的数据记录. 这个索引的key是数据表的主键, 因此InnoDB表数据文件本身就是主索引.
InnoDB要求表必须有主键(MyISAM可以没有), 如果没有显式指定, 则MySQL系统会自动选择一个可以唯一标识数据记录的列 作为主键, 如果不存在这种列, 则MySQL自动为InnoDB表生成一个隐含字段作为主键, 这个字段长度为6个字节, 类型为长整形
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址. 换句话说, InnoDB的所有辅助索引都引用主键作为data域