1.避免使用select*你需要什么信息,就查詢什么信息,查詢的多了,查詢的速度肯定就會慢
2.當你只需要查詢出一條數(shù)據(jù)的時候,要使用limit1比如你要查詢數(shù)據(jù)中是否有男生,只要查詢一條含有男生的記錄就行了,后面不需要再查了,使用Limit1可以在找到一條數(shù)據(jù)后停止搜索
3.建立高性能的索引索引不是隨便加的也不是索引越多越好,更不是所有索引對查詢都有效
4.建數(shù)據(jù)庫表時,給字段設置固定合適的大小.字段不能設置的太大,設置太大就造成浪費,會使查詢速度變慢
5.要盡量使用notnull
6.EXPLAIN你的SELECT查詢使用EXPLAIN,可以幫助你更了解MySQL是如何處理你的sql語句的,你可以查看到sql的執(zhí)行計劃,這樣你就能更好的去了解你的sql語句的不足,然后優(yōu)化語句.
7.在Join表的時候,被用來Join的字段,應該是相同的類型的,且字段應該是被建過索引的,這樣,MySQL內(nèi)部會啟動為你優(yōu)化Join的SQL語句的機制。
8.如果你有一個字段,比如“性別”,“國家”,“民族”,“省份”,“狀態(tài)”或“部門”,這些字段的取值是有限而且固定的,那么,應該使用ENUM而不是VARCHAR。
因為在MySQL中,ENUM類型被當作數(shù)值型數(shù)據(jù)來處理,而數(shù)值型數(shù)據(jù)被處理起來的速度要比文本類型快得多。這樣,我們又可以提高數(shù)據(jù)庫的性能。
9.垂直分割將常用和有關(guān)系的字段放在相同的表中,把一張表的數(shù)據(jù)分成幾張表這樣可以降低表的復雜度和字段的數(shù)目,從而達到優(yōu)化的目的
10.優(yōu)化where查詢
①.避免在where子句中對字段進行表達式操作
比如:select列from表whereage*2=36;建議改成select列from表whereage=36/2;
②.應盡量避免在where子句中使用!=或操作符,否則將引擎放棄使用索引而進行全表掃描。
③.應盡量避免在where子句中對字段進行null值判斷
④.應盡量避免在where子句中使用or來連接條件
11.不建議使用%前綴模糊查詢,這種查詢會導致索引失效而進行全表掃描
例如LIKE“%name”或者LIKE“%name%這兩種都是不建議的.但是可以使用LIKE“name%”。
對于LIKE“%name%,可以使用全文索引的形式
12.要慎用in和notin
例如:selectidfromtwherenumin(1,2,3)建議改成selectidfromtwherenumbetween1and3
對于連續(xù)的數(shù)值,能用between就不要用in了
13.理解in和exists,notin和notexists的區(qū)別
很多時候用exists代替in是一個好的選擇:如查詢語句使用了notin那么內(nèi)外表都進行全表掃描,沒用到索引,而notexists子查詢依然能用到表上索引,所以無論哪個表大,用notexists都比notin要快。
selectnumfromawherenumin(selectnumfromb)
建議改成:selectnumfromawhereexists(select1frombwherenum=a.num)
區(qū)分in和exists主要是造成了驅(qū)動順序的改變(這是性能變化的關(guān)鍵),如果是exists,那么以外層表為驅(qū)動表,先被訪問,如果是IN,那么先執(zhí)行子查詢。所以IN適合于外表大而內(nèi)表小的情況;EXISTS適合于外表小而內(nèi)表大的情況。
關(guān)于notin和notexists,推薦使用notexists,不僅僅是效率問題,notin可能存在邏輯問題
14.理解selectCount(*)和SelectCount(1)以及SelectCount(column)區(qū)別
一般情況下,SelectCount(*)和SelectCount(1)兩著返回結(jié)果是一樣的
假如表沒有主鍵(Primarykey),那么count(1)比count(*)快,
如果有主鍵的話,那主鍵作為count的條件時候count(主鍵)最快
如果你的表只有一個字段的話那count(*)就是最快的
count(*)跟count(1)的結(jié)果一樣,都包括對NULL的統(tǒng)計,而count(column)是不包括NULL的統(tǒng)計
技術(shù)交流請關(guān)注“大數(shù)據(jù)java架構(gòu)師”