浅谈数据库性能优化
1.truncate、delete、drop的区别
truncate和delete只能删除数据,不删除表的结构。drop语句将删除表的结构,包括被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的的存过程/函数将保留,但是处于invalid状态
- truncate在各种表上,无论是大的还是小的,都非常快。
- 如果执行roll back命令,delete将会被撤销,而truncate则不会被撤销
- truncate不能进行回滚操作
- truncate不触发任何delete触发器
- 当表被truncate后,这个表和索引占用的空间会恢复到初始大小,而delete操作不会减少表或索引所占用的空间
- 不能truncate一个带有外键的表,如果要删除首先要取消外键,然后再删除
- delete语句执行删除的过程是每次从表里删除一行并且将该行的删除操作作为事务记录再日志中保存,以便进行回滚操作
小结:
truncate table一次性从表中删除所有的数据页,不把单独的删除操作记录写入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器,执行速度快。
delete语句可以通过where对要删除的记录进行选择。而使用truncate table将删除表中所有的记录。因此,delete语句更加灵活。如果delete不加where子句,delete可以返回被删除的记录数,而truncate table返回的是0.
2.Hibernate和Mybatis的区别
2.1简介
- Hibernate框架是一个开源的对象关系映射框架,对JDBC进行轻量级的对象封装,建立对象与数据库表的映射,是一个全自动、完全面向对象的持久层框架。
- Mybatis是一个开源对象关系映射框架,(原名ibatis,2010年Google接管后更名),是一个半自动化的持久层框架
2.2区别
- 开发方面
- Hibernate在开发中,sql语句已经被封装,直接可以使用,加快系统的开发
- Mybatis属于半自动化,sql需要手工完成,稍显繁琐
- SQL优化
- Hibernate自动生成sql,有些语句较为繁琐,比较消耗性能
- Mybatis手写sql,可以避免不需要的查询,提高系统性能
- 对象管理比对
- Hibernate是完整的对象-关系映射的框架,开发过程中无需关注底层实现,只需管理对象即可。
- Mybatis需要自行管理映射关系
- 缓存方面
- 相同点:Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,可以实现第三方缓存方案
- 不同点:Hibernate的二级缓存配置在Session Factory生成的配置文件进行详细配置。Mybatis的二级缓存配置都是在每个具体的表-对象中进行详细配置
2.3Hibernate优势
- Hibernate的DAO层开发比Mybatis简单,Mybatis需要维护SQL和结果映射
- Hibernate在对象的维护和缓存要比Mybatis,增删改查对象维护方便
- Hibernate数据库移植性好,Mybatis的数据库移植性不好,不同数据库需要写不同的Sql
- Hibernate有更好的二级缓存机制,可以使用第三方缓存,Mybatis本身提供的缓存机制不佳
2.4Mybatis优势
- Mybatis可以进行更为细致的Sql优化,可以减少查询字段
- Mybatis容易掌握,而Hibernate门槛较高
小结
Mybatis:小巧、方便、高效、简单、直接、半自动
Hibernate:强大、方便、高效、复杂间接、全自动化
3.数据库索引
数据库索引是数据管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。
- 平衡二叉树:左右子树深度差的绝对值不超过1,通过左旋或右旋调整AVL树的平衡
- B Tree 能解决的问题,B+Tree都能解决
- 扫库、扫表能力更强
- 磁盘读写能力更强、排序能力更强,效率更加稳定
- 主键索引:存储索引和数据
- 辅助索引:存储索引和主键值