之前公司的历史项目都是用的sqlserver,但是几年里遇到的坑实在太多了,从早期的高并发情况下select与update之间死锁,到无法针对单个字段设置字符集等等,另外还有出现问题需要排查时可供参考的资料较少。这边后期的项目就开始往mysql倾斜了,早期的项目重构后也采用mysql数据库。
工欲善其事,必先利其器。mysql目前最常用的是innodb引擎,这边花了几周时间去研究了一下mysql的innodb引擎,从开发的角度学习了一下相关知识,主要内容来源于《Mysql技术内幕-InnoDB存储》。下面给大家分享一下学习的内容。
Mysql常用引擎
InnoDB 支持事务,通过MVCC来控制并发,支持行锁,默认隔离级别为可重复读,通过间隙锁来避免幻读。拥有自适应哈希索引,插入缓冲,二次写等特性。
MyISAM 默认引擎,不支持事务,不支持行锁,查询效率高。因此一般在互联网项目中是不会采用的。
mysql日志
1.错误日志 错误日志中对数据库的启动、运行和关闭进行了记录。数据库出现问题时优先查看错误日志;
查看错误日志:show variables like ‘log_error’;
2.慢sql日志 需要手动开启,配置开启与超时阙值后,会记录超时的sql语句,没用过。目前我在项目中慢sql监控都是用的阿里德鲁伊druid自带的监控。
3.查询日志 记录了所有查询的日志,默认文件名为 主机名.log
4.二进制文件 就是平时常说的beanlog,记录了所有对数据库进行修改的操作。主要用于数据恢复及数据同步,平常我们也会用来排查数据修改的轨迹。默认关闭,但是开启对性能影响不大。建议开启。
查看日志文件:show master logs
5.表结构文件、表空间文件
6.重做日志文件 存储了innodb引擎的事务日志,在数据库宕机时,innodb引擎会用重做日志将数据库恢复到宕机之前,保证数据完整性。
InnoDB存储结构
表空间–段(segment)–区(extent)–页(page)
数据库约束
唯一约束 Unique Key
外键约束 Foreign Key
主键约束 Primary Key
非空约束 Not Null
约束与索引关系
当我们创建了一个唯一索引时,就创建了一个唯一约束;
约束是一个逻辑概念,用来保证数据完整性;索引是一个数据结构,有逻辑上概念,更是真实存在的物理文件;
InnoDB索引
B+树索引 最常用的索引,基于B+树(多叉平衡树),聚集索引其实就是一个B+树索引,叶子节点上包含所有记录信息;非聚集索引叶子节点上包含主键的值,可以通过主键的值再关联到记录信息;
哈希索引 hash结构,innodb具有自适应哈希索引,也可以主动创建哈希索引 利用哈希算法对字典进行查找,哈希冲突时采用链表,与haahmap设计思路相近;等值查询时速度快,但是范围查询与模糊查询无效;