mysql效能優化的一些小tips

2021-08-25 02:12:03 字數 2264 閱讀 5973

(1)

針對innodb表,盡量不執行selectcount(*)語句,因為innodb表沒有類似myisam那樣的內部計數器來記錄表記錄總量,執行這個操作將會全表掃瞄,速度很慢.

(2)盡量使用myisam表,除非必須使用其他型別,因為myisam型別的總體讀寫效率是相當高的,缺點是表級鎖,而不是行/頁級鎖.

(3)善用explain來幫助你分析查詢優化情況

(4)如果需要對乙個較大的且併發讀寫較多的資料表做groupby等統計操作,建議使用摘要表來儲存統計資訊,定期更新統計表,這可能獲得很大的效能改善.

(5)查詢時如果有orderby分句的話,注意讓它的字段順序和索引字段順序對應,這樣能加快排序速度

(6)如果有乙個多字段索引,則查詢時,必須按照索引順序來使用,否則該索引不會用到.例如:

索引`idx_`(col1,col2,col3),那麼查詢select....from...wherecol1=1andcol2=2;使用索引,而查詢...wherecol2=2andcol3=3;或...wherecol1=1andcol3=3;則不使用索引.

where中的條件如果有恒量型別的(如`field`=1),就盡量放在前面,這樣能更快的執行過濾.

(7)2個表連線時,連線欄位的型別最好一致(包括字段長度),這樣的話索引速度快多了.

(8)大部分情況下,字元型別的字段索引值需要一部分,例如createindexchar_idxontbl1(name(10));

(9)盡量使用最合適的資料型別,能使用enum就不使用tinyint,能使用smallint就不使用mediumint.這樣能節省儲存空間,增加資料儲存量,提高搜尋速度.不要擔心這樣會對省級產生很大的影響,因為加入從tinyint型別改變為int的話,並不會改變原來的資料.

(10)

如果知道某個表總是頻繁使用的話,可以把它放到hot_cache中,用以下方法:

setglobalhot_cache.key_buffer_size=128*1024;

cacheindex`***`inhot_cache;

(11)

把拖沓複雜,速度慢的的查詢分解成多個簡潔明瞭的查詢,這樣儘管查詢次數多了,但是總體速度和效率卻可能反而更高了,而且也減少了鎖表的可能.

(12)

執行查詢時,盡量不使用外部函式,因為這樣的話就無法使用可能存在的索引,並且無論如何都會極大地降低效率.如:...where`create_time`>unix_timestamp(now());這樣的查詢.可以在程式中把當前的時間取得,然後直接執行構造好了的sql語句.

(13)

在索引欄位上使用like查詢時,左邊不要使用'%'修飾符,這樣就可以利用索引,否則無法使用索引.如...`name`like'yejr%';.

(15)

如果有可能,多使用儲存過程,這大概能獲得22%的效能提高.

(16)

如果併發訪問量相對最大連線數小多了的話,最好使用永久連線,這樣能節省不少連線時的系統資源損耗.

(17)

定期的在myisam表上執行optimizetable,這能整理隨便,提高索引效率.

(18)

如果你主要按col1,col2,...順序檢索記錄,請在對錶大量更改後執行altertable...orderbycol1,col2,...語句,這可以獲得更好的效能.

(19)

對於頻繁更改的myisam表,應盡量避免更新所有變長字段(varchar、blob和text).

(20)

對於記錄總數超過500萬的單錶,就應該趕緊考慮分表了.分表策略有多種,比如按id號段,或者按時間切分,等等.

(21)

建立資料表時盡量指定字段不能為null,並且有預設值.

(22)

使用loaddata,而不是使用大批量的insert語句來匯入資料,即使用insert的話,可以同時insert多條資料,提高效率

(23)

使資料表名和欄位名盡可能的短,例如在user表中使用欄位名name,而不是user_name.

(24)

用delay_key_write=1選項讓myisam更快地更新索引,因為在表關閉之前它們不重新整理到硬碟上.缺點是如果伺服器如果突然被殺掉了,重啟之後就必須執行myisamchk修復索引才行.

(25)

採用複製機制來分攤讀資料的負載,把寫資料只放在主伺服器上,把讀平均分攤到各個從伺服器上,能大大提高系統負載.

(26)

如果是批量匯入資料到db裡,可以考慮先關閉索引,等匯入後,再加上索引,已提高效率

優化記憶體的一些小細節

摘自 1.迴圈中物件占用記憶體大 這個問題常見於迴圈次數較大,迴圈體生成的物件占用記憶體較大的情景。例子 我需要10000個演員來打仗 1 2 3 4 for int i 0 i 10000 i 該迴圈內產生大量的臨時物件,直至迴圈結束才釋放,可能導致記憶體洩漏,解決方法和上文中提到的自動釋放池常見...

React Redux使用的一些小優化

之前畫了一張redux的流程圖,可以看看右下角的部分,可以看出來怎麼進行優化。也就是能不改變就不改變。比如不要做下面這種無謂的事情 function reducer state,action 這個 雖然在selector中,也可以通過arestatepropsequal來判斷計算後的state是否發...

mysql一些小例子

在群裡遇到有人問了個問題 其表結構如下 img 他想要用sql 如何更新 站號 列各出現的次數到 頻次 列。注 站號對應 name,頻次對應 no 最後用游標實現了他想的功能 create procedure pro hzcount begin declare cur no,y int declar...