1. sql調(diào)優(yōu)
- 對(duì)查詢(xún)進(jìn)行優(yōu)化, 避免全表掃描,首先應(yīng)考慮在 where及order by涉及的列上使用索引
- 避免在where子句中對(duì)字段進(jìn)行null值判斷, 否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
select id form t where num is null
可以在num設(shè)置默認(rèn)值0,確保表中的num列沒(méi)有null值,然后這樣查詢(xún)
select id form t where num = 0
- 避免在where子句中使用!=或<>操作符, 否則引擎放棄使用索引而進(jìn)行全表掃描.
- 避免在where子句中使用or來(lái)連接條件,如果一個(gè)字段有索引, 一個(gè)字段沒(méi)有索引, 引擎將放棄使用索引而使用全表掃描,如:
select id from t where num=10 or name='admin'
可以這樣查詢(xún):
select id from t where num = 10
union all
select id from t where name='admin'
- in 和 not in 也要慎用, 否則會(huì)導(dǎo)致全表掃描, 如
select id from t where num in(1,2,3)
對(duì)于連續(xù)的數(shù)值, 能用between不要用in
select id from t where num between 1 and 3
- 避免在where子句中對(duì)字段進(jìn)行表達(dá)式或者函數(shù)操作,否則引擎放棄使用索引而進(jìn)行全表掃描.
- 避免使用模糊查詢(xún), 可使用全文檢索
- 避免使用 * , 使用具體字段代替 *
2. 引擎問(wèn)題
特點(diǎn) | Myisam | BDB | Memery | InnoDB | Archive | |
---|---|---|---|---|---|---|
存儲(chǔ)限制 | 沒(méi)有 | 沒(méi)有 | 有 | 64TB | 沒(méi)有 | |
事物安全 | 支持 | 支持 | ||||
鎖機(jī)制 | 表鎖 | 頁(yè)鎖 | 表鎖 | 行鎖 | 行鎖 | |
B樹(shù)索引 | 支持 | 支持 | 支持 | 支持 | ||
哈希索引 | 支持 | 支持 | ||||
全文索引 | 支持 | |||||
集群索引 | 支持 | |||||
數(shù)據(jù)緩存 | 支持 | 支持 | ||||
索引緩存 | 支持 | 支持 | ||||
數(shù)據(jù)可壓縮 | 支持 | 支持 | ||||
空間使用 | 低 | 低 | N/A | 高 | 非常低 | |
內(nèi)存使用 | 低 | 低 | 中等 | 高 | 低 | |
批量插入的速度 | 高 | 高 | 高 | 低 | 非常高 | |
支持外鍵 | 支持 |
- 最常使用的兩種存儲(chǔ)引擎
- Myisam存儲(chǔ)引擎. 當(dāng)create創(chuàng)建新表時(shí), 為指定新表的存儲(chǔ)引擎時(shí), 默認(rèn)使用Myisam. 數(shù)據(jù)文件和索引文件可以放置在不同的目錄, 平均分布io, 獲得更快的速度.
- innoDB(MySQL的默認(rèn)引擎)存儲(chǔ)引擎提供了具有提交, 回滾和崩潰恢復(fù)能力的事物安全, 但是對(duì)比 Myisam的存儲(chǔ)引擎, InnoDB寫(xiě)的處理效率差一些并且會(huì)占用更多的磁盤(pán)空間以保留數(shù)據(jù)和索引
- 如何選擇合適的存儲(chǔ)引擎
選擇標(biāo)準(zhǔn): 根據(jù)應(yīng)用特點(diǎn)選用合適的存儲(chǔ)引擎, 對(duì)于復(fù)雜的應(yīng)用系統(tǒng)可以根據(jù)實(shí)際情況選擇多種引擎進(jìn)行組合.
- Myisam: 插件式存儲(chǔ)引擎, 他是在web, 數(shù)據(jù)倉(cāng)庫(kù)和其他應(yīng)用環(huán)境下最常使用的存儲(chǔ)引擎之一
- InnoDB: 用于事物處理應(yīng)用程序, 具有眾多特性, 包括ACID事物支持
- Memory: 將所有數(shù)據(jù)保存在RAM中, 在需要快速查找引用和其他類(lèi)似數(shù)據(jù)的情況下, 可提供極快的訪問(wèn).
- Merge: 允許MySQLDBA或開(kāi)發(fā)人員將一系列等同的Myisam表以邏輯方式組合在一起, 并作為一個(gè)對(duì)象引用他們, 對(duì)于諸如數(shù)據(jù)倉(cāng)庫(kù)等VLDB環(huán)境十分合適.
3. 數(shù)據(jù)持久化
- 數(shù)據(jù)持久化就是把內(nèi)存中數(shù)據(jù)模型轉(zhuǎn)化為存儲(chǔ)模型
- 數(shù)據(jù)持久化的好處
- 程序代碼重用性強(qiáng), 即使更換數(shù)據(jù)庫(kù), 只需要更改配置文件, 不必重寫(xiě)程序代碼
- 業(yè)務(wù)邏輯代碼可讀性強(qiáng), 在代碼中不會(huì)有大量sql語(yǔ)言, 提高程序可讀性
- 持久化技術(shù)可以自動(dòng)優(yōu)化, 以減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)量, 提高程序運(yùn)行效率