介紹幾種提高mysql的效能和對於sql的優化的方法
筆者自己平時因為用mysql比較多,而且mysql的資料量也比較大,所以這裡希望能夠提供一些優化mysql資料庫的一些方法,每招都是成本從低到高。也是一般我們開發先執行的順序。
第一招:
優化你的sql和新增索引,還有設定儲存引擎 (MYISAM和INNODB);
(比如你查詢的sql儘量查到剛好夠用的資料就好,索引不要太多要設定的合理,對於經常要查詢的欄位記得新增索引。如果一個表對事物要求不高,我們可以選MYISAM提高自己表的效能,這些都要根據實際業務自己做調整)
第二招:
加快取,memcached,redis;
(對於很多資料,我們都可以用memcached和redis進行快取,現在比較推薦redis,使用no sql資料庫快取的話能夠大幅度提高資料庫的效能)
第三招:
可以對資料庫做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas。
(不懂的大家可以去百度主從庫。一般就是有一個主庫和一個從庫,從庫會實時複製主庫的資訊,然後主庫負責寫和改資料,然後從庫負責讀資料)
第四招:
如果你還是覺得不夠快,先不要想著去做切分,mysql自帶分割槽表,先試試這個,對你的應用是透明的,無需更改程式碼,但是sql語句是需要針對分割槽表做優化的,sql條件中要帶上分割槽條件的列,從而使查詢定位到少量的分割槽上,否則就會掃描全部分割槽,另外分割槽表還有一些坑,在這裡就不多說了;
第五招:
如果覺得還不夠快,那就先做垂直拆分,其實就是根據你模組的耦合度,將一個大的系統分為多個小的系統,也就是分散式系統;
第六招:
接下來才是水平切分,針對資料量大的表,這一步最麻煩,最能考驗技術水平,要選擇一個合理的sharding key,為了有好的查詢效率,表結構也要改動,做一定的冗餘,應用也要改,sql中儘量帶sharding key,將資料定位到限定的表上去查,而不是掃描全部的表;
mysql資料庫一般都是按照這個步驟去演化的,成本也是由低到高;
有人也許要說第一步優化sql和索引這還用說嗎?的確,大家都知道,但是很多情況下,這一步做的並不到位,甚至有的只做了根據sql去建索引,根本沒對sql優化(中槍了沒?),除了最簡單的增刪改查外,想實現一個查詢,可以寫出很多種查詢語句,不同的語句,根據你選擇的引擎、表中資料的分佈情況、索引情況、資料庫優化策略、查詢中的鎖策略等因素,最終查詢的效率相差很大;優化要從整體去考慮,有時你優化一條語句後,其它查詢反而效率被降低了,所以要取一個平衡點;即使精通mysql的話,除了純技術面優化,還要根據業務面去優化sql語句,這樣才能達到最優效果;你敢說你的sql和索引已經是最優了嗎?
再說一下不同引擎的優化,myisam讀的效果好,寫的效率差,這和它資料儲存格式,索引的指標和鎖的策略有關的,它的資料是順序儲存的(innodb資料儲存方式是聚簇索引),他的索引btree上的節點是一個指向資料物理位置的指標,所以查詢起來很快,(innodb索引節點存的則是資料的主鍵,所以需要根據主鍵二次查詢);myisam鎖是表鎖,只有讀讀之間是併發的,寫寫之間和讀寫之間(讀和插入之間是可以併發的,去設定concurrent_insert引數,定期執行表優化操作,更新操作就沒有辦法了)是序列的,所以寫起來慢,並且預設的寫優先順序比讀優先順序高,高到寫操作來了後,可以馬上插入到讀操作前面去,如果批量寫,會導致讀請求餓死,所以要設定讀寫優先順序或設定多少寫操作後執行讀操作的策略;myisam不要使用查詢時間太長的sql,如果策略使用不當,也會導致寫餓死,所以儘量去拆分查詢效率低的sql,
innodb一般都是行鎖,這個一般指的是sql用到索引的時候,行鎖是加在索引上的,不是加在資料記錄上的,如果sql沒有用到索引,仍然會鎖定表,mysql的讀寫之間是可以併發的,普通的select是不需要鎖的,當查詢的記錄遇到鎖時,用的是一致性的非鎖定快照讀,也就是根據資料庫隔離級別策略,會去讀被鎖定行的快照,其它更新或加鎖讀語句用的是當前讀,讀取原始行;因為普通讀與寫不衝突,所以innodb不會出現讀寫餓死的情況,又因為在使用索引的時候用的是行鎖,鎖的粒度小,競爭相同鎖的情況就少,就增加了併發處理,所以併發讀寫的效率還是很優秀的,問題在於索引查詢後的根據主鍵的二次查詢導致效率低;
ps:很奇怪,為什innodb的索引葉子節點存的是主鍵而不是像mysism一樣存資料的實體地址指標嗎?如果存的是實體地址指標不就不需要二次查詢了嗎,這也是我開始的疑惑,根據mysism和innodb資料儲存方式的差異去想,你就會明白了,我就不費口舌了!
所以innodb為了避免二次查詢可以使用索引覆蓋技術,無法使用索引覆蓋的,再延伸一下就是基於索引覆蓋實現延遲關聯;不知道什麼是索引覆蓋的,建議你無論如何都要弄清楚它是怎麼回事!
盡你所能去優化你的sql吧!說它成本低,卻又是一項費時費力的活,需要在技術與業務都熟悉的情況下,用心去優化才能做到最優,優化後的效果也是立竿見影的!相關文章
- 提高網站效能的SSL/TLS最佳化方法介紹!網站TLS
- MySQL的SQL效能優化總結MySql優化
- Mysql多欄位大表的幾種優化方法MySql優化
- SQL隱碼攻擊的檢測方式有幾種?常用方法介紹!SQL
- 掌握提高 Web 應用的效能的方法 之 優化 PHP 和 LaravelWeb優化PHPLaravel
- Java的幾種建立例項方法的效能對比Java
- 介紹幾種MySQL常見的圖形化工具MySql
- 簡單介紹MySQL索引失效的幾種情況MySql索引
- MySQL線上新增欄位的幾種方案介紹MySql
- mysql中SQL的概念介紹MySql
- mysql最佳化通常使用的幾種方法MySql
- oracle優化之生產系統不改程式碼解決SQL效能問題的幾種方法Oracle優化SQL
- Redis持久化的兩種方式的優缺點介紹Redis持久化
- Oracle效能優化方法論的發展之二:基於OWI的效能優化方法論Oracle優化
- 幾種設計良好結構以提高.NET應用效能的方法
- 對於iOS效能優化的一點看法iOS優化
- 如果要做優化,CSS提高效能的方法有哪些?優化CSS
- MySQL 海量資料的 5 種分頁方法和優化技巧MySql優化
- sql最佳化的幾種方式SQL
- SQL優化的方法論SQL優化
- MySql常用30種SQL查詢語句優化方法MySql優化
- Oracle效能優化方法論的發展之六:基於流程分析和響應時間分析的效能優化方法論Oracle優化
- Oracle提高SQL執行效率的三種方法ITOracleSQL
- dble簡介及相對於MyCAT的優勢方面的介紹
- CSS效能優化的幾個技巧CSS優化
- 幾種 SAP ABAP OData 服務的效能評估和測試工具介紹試讀版
- Java中幾種常用的RPC框架介紹JavaRPC框架
- Linux安裝mysql的幾種方法LinuxMySql
- 兩種簡單分析和優化MySQL資料庫表的方法優化MySql資料庫
- Web 效能優化:21 種優化 CSS 和加快網站速度的方法Web優化CSS網站
- 資料庫SQL調優的幾種方式資料庫SQL
- 提高 SOLIDWORKS 大型裝配體和圖紙效能的 7 種方法Solid
- 關於ASP程式中常見的幾種指令碼語言介紹指令碼
- MYSQL的安全模式:sql_safe_updates介紹MySql模式
- Oracle效能優化方法論的發展之三:基於響應時間分析的效能優化方法論Oracle優化
- 對一條基於分割槽的簡單SQL的優化SQL優化
- webpack打包優化的幾種方案Web優化
- MySQL觸發器的使用和優缺點介紹ZGMHMySql觸發器