浅谈数据库性能优化
淺談數(shù)據(jù)庫(kù)性能優(yōu)化
1.truncate、delete、drop的區(qū)別
truncate和delete只能刪除數(shù)據(jù),不刪除表的結(jié)構(gòu)。drop語句將刪除表的結(jié)構(gòu),包括被依賴的約束(constrain)、觸發(fā)器(trigger)、索引(index);依賴于該表的的存過程/函數(shù)將保留,但是處于invalid狀態(tài)
- truncate在各種表上,無論是大的還是小的,都非常快。
- 如果執(zhí)行roll back命令,delete將會(huì)被撤銷,而truncate則不會(huì)被撤銷
- truncate不能進(jìn)行回滾操作
- truncate不觸發(fā)任何delete觸發(fā)器
- 當(dāng)表被truncate后,這個(gè)表和索引占用的空間會(huì)恢復(fù)到初始大小,而delete操作不會(huì)減少表或索引所占用的空間
- 不能truncate一個(gè)帶有外鍵的表,如果要?jiǎng)h除首先要取消外鍵,然后再刪除
- delete語句執(zhí)行刪除的過程是每次從表里刪除一行并且將該行的刪除操作作為事務(wù)記錄再日志中保存,以便進(jìn)行回滾操作
小結(jié):
truncate table一次性從表中刪除所有的數(shù)據(jù)頁,不把單獨(dú)的刪除操作記錄寫入日志保存,刪除行是不能恢復(fù)的。并且在刪除的過程中不會(huì)激活與表有關(guān)的刪除觸發(fā)器,執(zhí)行速度快。
delete語句可以通過where對(duì)要?jiǎng)h除的記錄進(jìn)行選擇。而使用truncate table將刪除表中所有的記錄。因此,delete語句更加靈活。如果delete不加where子句,delete可以返回被刪除的記錄數(shù),而truncate table返回的是0.
2.Hibernate和Mybatis的區(qū)別
2.1簡(jiǎn)介
- Hibernate框架是一個(gè)開源的對(duì)象關(guān)系映射框架,對(duì)JDBC進(jìn)行輕量級(jí)的對(duì)象封裝,建立對(duì)象與數(shù)據(jù)庫(kù)表的映射,是一個(gè)全自動(dòng)、完全面向?qū)ο蟮某志脤涌蚣堋?/li>
- Mybatis是一個(gè)開源對(duì)象關(guān)系映射框架,(原名ibatis,2010年Google接管后更名),是一個(gè)半自動(dòng)化的持久層框架
2.2區(qū)別
- 開發(fā)方面
- Hibernate在開發(fā)中,sql語句已經(jīng)被封裝,直接可以使用,加快系統(tǒng)的開發(fā)
- Mybatis屬于半自動(dòng)化,sql需要手工完成,稍顯繁瑣
- SQL優(yōu)化
- Hibernate自動(dòng)生成sql,有些語句較為繁瑣,比較消耗性能
- Mybatis手寫sql,可以避免不需要的查詢,提高系統(tǒng)性能
- 對(duì)象管理比對(duì)
- Hibernate是完整的對(duì)象-關(guān)系映射的框架,開發(fā)過程中無需關(guān)注底層實(shí)現(xiàn),只需管理對(duì)象即可。
- Mybatis需要自行管理映射關(guān)系
- 緩存方面
- 相同點(diǎn):Hibernate和Mybatis的二級(jí)緩存除了采用系統(tǒng)默認(rèn)的緩存機(jī)制外,可以實(shí)現(xiàn)第三方緩存方案
- 不同點(diǎn):Hibernate的二級(jí)緩存配置在Session Factory生成的配置文件進(jìn)行詳細(xì)配置。Mybatis的二級(jí)緩存配置都是在每個(gè)具體的表-對(duì)象中進(jìn)行詳細(xì)配置
2.3Hibernate優(yōu)勢(shì)
- Hibernate的DAO層開發(fā)比Mybatis簡(jiǎn)單,Mybatis需要維護(hù)SQL和結(jié)果映射
- Hibernate在對(duì)象的維護(hù)和緩存要比Mybatis,增刪改查對(duì)象維護(hù)方便
- Hibernate數(shù)據(jù)庫(kù)移植性好,Mybatis的數(shù)據(jù)庫(kù)移植性不好,不同數(shù)據(jù)庫(kù)需要寫不同的Sql
- Hibernate有更好的二級(jí)緩存機(jī)制,可以使用第三方緩存,Mybatis本身提供的緩存機(jī)制不佳
2.4Mybatis優(yōu)勢(shì)
- Mybatis可以進(jìn)行更為細(xì)致的Sql優(yōu)化,可以減少查詢字段
- Mybatis容易掌握,而Hibernate門檻較高
小結(jié)
Mybatis:小巧、方便、高效、簡(jiǎn)單、直接、半自動(dòng)
Hibernate:強(qiáng)大、方便、高效、復(fù)雜間接、全自動(dòng)化
3.數(shù)據(jù)庫(kù)索引
數(shù)據(jù)庫(kù)索引是數(shù)據(jù)管理系統(tǒng)中一個(gè)排序的數(shù)據(jù)結(jié)構(gòu),以協(xié)助快速查詢、更新數(shù)據(jù)庫(kù)表中數(shù)據(jù)。
- 平衡二叉樹:左右子樹深度差的絕對(duì)值不超過1,通過左旋或右旋調(diào)整AVL樹的平衡
- B Tree 能解決的問題,B+Tree都能解決
- 掃庫(kù)、掃表能力更強(qiáng)
- 磁盤讀寫能力更強(qiáng)、排序能力更強(qiáng),效率更加穩(wěn)定
- 主鍵索引:存儲(chǔ)索引和數(shù)據(jù)
- 輔助索引:存儲(chǔ)索引和主鍵值
總結(jié)
- 上一篇: 20分钟教你手写Sping MVC
- 下一篇: Centos7 安装和配置MySQL5.