mysql資料庫常見的兩個瓶頸是:cpu和i/o的瓶頸。
cpu在飽和的時候一般發生在資料裝入記憶體或從磁碟上讀取資料時候。
磁碟i/o瓶頸發生在裝入資料遠大於記憶體容量的時候,如果應用分布在網路上,那麼查詢量相當大的時候那麼平瓶頸就會出現在網路上。
我們可以用mpstat, iostat, sar和vmstat來檢視系統的效能狀態。除了伺服器硬體的效能瓶頸,對於mysql系統本身,我們可以使用工具來優化資料庫的效能。
mysql的優化,大體可以分為三部分:索引的優化,sql語句的優化,表的優化
1.索引
一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現效能問題,在生產環境中,我們遇到最多的也是最容易出現問題的,還是一些複雜的查詢操作,因此對查詢語句的優化是重中之重,加速查詢最好的方法就是索引。
索引:簡單的說,相當於圖書的目錄,可以幫助使用者快速的找到需要的內容。
在mysql中也叫做「鍵」,是儲存引擎用於快速找到記錄的一種資料結構。能夠大大提高查詢效率。特別是當資料量非常大,查詢涉及多個表時,使用索引往往能使查詢速度加快成千上萬倍。
總結:索引的目的在於提高查詢效率,與我們查詢圖書所用的目錄是乙個道理:先定位到章,然後定位到該章下的乙個小結,然後找到頁數。相似的例子還有:查字典,查地圖等。
2.索引型別
是最基本的索引,它沒有任何限制。
與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。
指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第乙個字段,索引才會被使用。
是一種特殊的唯一索引,乙個表只能有乙個主鍵,不允許有空值。一般是在建表的時候同時建立主鍵索引
主要用來查詢文字中的關鍵字,而不是直接與索引中的值相比較。fulltext索引跟其它索引大不相同,它更像是乙個搜尋引擎,而不是簡單的where語句的引數匹配。fulltext索引配合match against操作使用,而不是一般的where語句加like。它可以在create table,alter table ,create index使用,不過目前只有char、varchar,text 列上可以建立全文索引。值得一提的是,在資料量較大時候,現將資料放入乙個沒有全域性索引的表中,然後再用create index建立fulltext索引,要比先為一張表建立fulltext然後再將資料寫入的速度快很多。3.索引優化
1.如何捕獲低效sql
1)slow_query_log
這個引數設定為on,可以捕獲執行時間超過一定數值的sql語句。
2)ong_query_time
當sql語句執行時間超過此數值時,就會被記錄到日誌中,建議設定為1或者更短。
3)slow_query_log_file
記錄日誌的檔名。
4)log_queries_not_using_indexes
這個引數設定為on,可以捕獲到所有未使用索引的sql語句,儘管這個sql語句有可能執行得挺快。
2.慢查詢優化的基本步驟
1)先執行看看是否真的很慢,注意設定sql_no_cache
2)where條件單錶查,鎖定最小返回記錄表。這句話的意思是把查詢語句的where都應用到表中返回的記錄數最小的表開始查起,單錶每個字段分別查詢,看哪個欄位的區分度最高
3)explain檢視執行計畫,是否與1預期一致(從鎖定記錄較少的表開始查詢)
4)order by limit 形式的sql語句讓排序的表優先查
5)了解業務方使用場景
6)加索引時參照建索引的幾大原則
7)觀察結果,不符合預期繼續從1開始分析
2.優化原則
資料表拆分:主要就是垂直拆分和水平拆分。
水平切分:將記錄雜湊到不同的表中,各表的結構完全相同,每次從分表中查詢, 提高效率。
垂直切分:將表中大字段單獨拆分到另外一張表, 形成一對一的關係。
總之:
mysql的優化主要就在於:索引的優化,sql語句的優化,表的優化,在高併發網路環境下,除了優化資料庫外,還會涉及到分布式快取,cdn,資料庫讀寫分離等高併發優化技術。
以上就是mysql的優化技術方案,以下是最新阿里p8架構師談架構設計系列。
MySQL慢查詢優化 索引優化 以及表等優化總結
mysql資料庫常見的兩個瓶頸是 cpu和i o的瓶頸。cpu在飽和的時候一般發生在資料裝入記憶體或從磁碟上讀取資料時候。磁碟i o瓶頸發生在裝入資料遠大於記憶體容量的時候,如果應用分布在網路上,那麼查詢量相當大的時候那麼平瓶頸就會出現在網路上。我們可以用mpstat,iostat,sar和vmst...
MySQL索引原理與慢查詢優化
索引的目的在於提高查詢效率,可以模擬字典,如果要查 mysql 這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。如果沒有索引,那麼你可能需要把所有單詞看一遍才能找到你想要的,如果我想找到m開頭的單詞呢?或者w開頭的單詞呢?是不是覺得如果沒有索引,這個事情根本無法完成?...
MySQL索引原理及慢查詢優化
通過不斷的縮小想要獲得資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是通過同一種查詢方式來鎖定資料。資料庫索引就是通過演算法提高查詢效率。磁碟io與預讀 考慮到磁碟io是非常高昂的操作,計算機作業系統做了一些優化,當一次io時,不光把當前磁碟位址的資料,而是把相鄰的資...