一烟零、數(shù)據(jù)類型優(yōu)化
合適的數(shù)據(jù)類型以及存儲長度瘪松,不但節(jié)約數(shù)據(jù)庫表空間咸作、節(jié)約索引存儲,更重要的是提升檢索速度宵睦。
通常的標(biāo)準(zhǔn)是:
1.越小越好记罚。一般情況下,在能正確存儲數(shù)據(jù)的前提下壳嚎,使用最小的數(shù)據(jù)類型桐智。更小的數(shù)據(jù)類型意味著更快的速度,以及更小的磁盤空間烟馅、內(nèi)存说庭、CPU占用。
比如:人的年齡郑趁,最多三位數(shù)字刊驴,并且不會是負(fù)數(shù),可以使用unsigned tinyint(0-255)寡润。太陽的年齡使用int;
比如:使用timestamp類型要比datetime類型少一半的存儲空間
2.簡單就好捆憎,簡單的數(shù)據(jù)類型操作需要更少的CPU周期。能使用char的就不用varchar梭纹,能使用varchar就不用text和blob(不過公司的開發(fā)規(guī)范當(dāng)中不推薦讓使用blob和text)
3.盡量使用NOT NULL攻礼。在設(shè)計schema時,盡量指定一個字段的值為NOT NULL栗柒,mysql的NULL是占用存儲空間的,并且會降低索引的效率
二知举、索引優(yōu)化
索引對查詢速度的影響大瞬沦,正確認(rèn)識索引和創(chuàng)建索引,是數(shù)據(jù)庫性能調(diào)優(yōu)的起點(diǎn)雇锡。
一般索引加在where 逛钻、join、order by 后面出現(xiàn)的列上锰提。MySQL只對<曙痘,<=,=立肘,>边坤,>=,BETWEEN谅年,IN茧痒,以及某些時候的LIKE才會使用索引.。在以通配符%和_開頭作查詢時like是不用索引的融蹂。
例如下句會使用索引:
SELECT * FROM mytable WHERE username like'admin%'
而下句就不會使用:
SELECT * FROM mytable WHEREt Name like'%admin'
因此旺订,在使用LIKE時應(yīng)注意以上的區(qū)別弄企。
使用索引時,有以下一些技巧和注意事項:
索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中区拳,復(fù)合索引中只要有一列含有NULL值拘领,那么這一列對于此復(fù)合索引就是無效的。所以我們在數(shù)據(jù)庫設(shè)計時不要讓字段的默認(rèn)值為NULL樱调。
使用短索引
對串列進(jìn)行索引约素,如果可能應(yīng)該指定一個前綴長度。例如本涕,如果有一個CHAR(255)的列业汰,如果在前10個或20個字符內(nèi),多數(shù)值是惟一的菩颖,那么就不要對整個列進(jìn)行索引样漆。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間和I/O操作。在絕大多數(shù)應(yīng)用里晦闰,數(shù)據(jù)庫中的字符串?dāng)?shù)據(jù)大都以各種各樣的名字為主放祟,把索引的長度設(shè)置為10~15個字符已經(jīng)足以把搜索范圍縮小到很少的幾條數(shù)據(jù)記錄了。
索引列排序
MySQL查詢只使用一個索引呻右,因此如果where子句中已經(jīng)使用了索引的話跪妥,那么order by中的列是不會使用索引的。因此數(shù)據(jù)庫默認(rèn)排序可以符合要求的情況下不要使用排序操作声滥;盡量不要包含多個列的排序眉撵,如果需要最好給這些列創(chuàng)建復(fù)合索引。
like語句操作
一般情況下不鼓勵使用like操作落塑,如果非使用不可纽疟,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引憾赁。
不要在列上進(jìn)行運(yùn)算污朽、使用函數(shù)?、以及表達(dá)式
select * from users where YEAR(adddate)<2007; 將在每個行上進(jìn)行運(yùn)算龙考,這將導(dǎo)致索引失效而進(jìn)行全表掃描蟆肆,因此我們可以改成
select * from users where adddate<‘2007-01-01’;
select id from t where num/2=100,也會放棄使用索引晦款,應(yīng)該改成select id from t where num=100*2
不使用NOT IN和<>操作
對于not in炎功,可以用not exists或者(外聯(lián)結(jié)+判斷為空)來代替;
對于<>柬赐,用其它相同功能的操作運(yùn)算代替亡问,如a<>0 改為 a>0 or a<0
最后需要注意的是,索引也不是越多越好。大量的索引除了會占用存儲空間外州藕,也會降低insert以及delete的效率束世。
三、查詢優(yōu)化
1.建立索引床玻,提高查詢速度闷沥,參考上面內(nèi)容
2.避免使用or侣滩,or語句兩邊都不能使用索引,且是全表掃描⊥⒘#可使用 union all代替
3.in和not in也要慎用毯欣,可使用between和exist代替in
4.避免使用select * ?from ?tablename ?,用到哪些字段寫哪些字段
5.減少大結(jié)果集的group by 吃型,group by的字段也要加索引
6.子查詢也要慎用唧瘾,可以嘗試join方式