記住以下思路,參考最有效的文章,都是博客里的網上,總結整理(個人),以備下次做優化的時候可以快速,如有更好的優化建議 希望能留言一下。
(1)、根據服務層面:配置mysql性能優化參數;
參考這哥們—憤怒的小鳥(寫的很詳細可以參考,MySQL性能優化之參數配置)
(2)、從系統層面增強mysql的性能:優化數據表結構、字段類型、字段索引、分表,分庫、讀寫分離等等。
表結構:數據類型選擇;字符編碼;適當拆分;適度冗余;盡量使用 NOT NULL 詳細,
(3)、從數據庫層面增強性能:優化SQL語句,合理使用字段索引。
必看:Mysql是否需要建立索引的九大場景
1、表的主鍵、外鍵必須有索引; 2、數據量超過300的表應該有索引; 3、經常與其他表進行連接的表,在連接字段上應該建立索引; 4、經常出現在Where子句中的字段,特別是大表的字段,應該建立索引; 5、索引應該建在選擇性高的字段上; 6、索引應該建在小字段上,對於大的文本字段甚至超長字段,不要建索引; 7、復合索引的建立需要進行仔細分析;盡量考慮用單字段索引代替: a、正確選擇復合索引中的主列字段,一般是選擇性較好的字段; b、復合索引的幾個字段是否經常同時以AND方式出現在Where子句中?單字段查詢是否極少甚至沒有?如果是,則可以建立復合索引;否則考慮單字段索引; c、如果復合索引中包含的字段經常單獨出現在Where子句中,則分解為多個單字段索引; d、如果復合索引所包含的字段超過3個,那么仔細考慮其必要性,考慮減少復合的字段; e、如果既有單字段索引,又有這幾個字段上的復合索引,一般可以刪除復合索引; 8、頻繁進行數據操作的表,不要建立太多的索引; 9、刪除無用的索引,避免對執行計划造成負面影響;
數據庫方面的技能要求,包括三個方面: 第一,基本的增刪改查,存儲過程等技能,是否會用些group by,having,distinct,exist,in,with等高級點的語句, 第二,有沒有設計表的經驗, 第三,也是關鍵一點,在數據庫優化方面,MySQL性能優化的最佳21條經驗。 索引是數據庫優化所必需的工具,一般會問以下兩方面的問題: ①索引有什么代價?哪些場景下你需要建索引?或者有時候反過來問,哪些場景下不推薦建索引。 代價:時間; 推薦:最佳21條經驗;Mysql哪些地方需要建立索引 不推薦: 什么情況下不推薦使用索引? 1) 數據唯一性差(一個字段的取值只有幾種時)的字段不要使用索引 比如性別,只有兩種可能數據。意味着索引的二叉樹級別少,多是平級。這樣的二叉樹查找無異於全表掃描。 2) 頻繁更新的字段不要使用索引 比如logincount登錄次數,頻繁變化導致索引也頻繁變化,增大數據庫工作量,降低效率。 3) 字段不在where語句出現時不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%輸入符%’等條件,不建議使用索引 只有在where語句出現,mysql才會去使用索引 4) where 子句里對索引列使用不等於(<>),使用索引效果一般 ②建好索引之后,怎么才能最高效地利用索引?或者反過來問,請說出一個無法有效利用已建索引的案例。 如果條件中有or(注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引), 對於多列索引, like查詢是以%開頭, where 子句里對索引列上有數學運算,用不上索引
(4)、從代碼層面增強性能:使用緩存和NoSQL數據庫方式存儲,如MongoDB/Memcached/Redis來緩解高並發下數據庫查詢的壓力。
(5)、減少數據庫操作次數,盡量使用數據庫訪問驅動的批處理方法。
(6)、不常使用的數據遷移備份,避免每次都在海量數據中去檢索。
(7)、提升數據庫服務器硬件配置,或者搭建數據庫集群。
(8)、編程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查詢;正則表達式過濾(非法字符串過濾);