Mysql优化分析
一、mysql性能下降的原因及對策
- 數據過多–>分庫分表
- 關聯了太多的表,太多join–>Sql優化
- 沒有充分利用到索引–>利用索引
- 服務器調優及各個參數設置–>調整my.cnf
以下是7種join圖示:
二、索引優化
MySQL官方對索引的定義為:
索引(Index)是幫助MySQL高效獲取數據的數據結構。可以得到索引的本質:索引是數據結構。
索引的目的在于提高查詢效率,可以類比字典。
如果要查“mysql”這個單詞,我們肯定需要定位到m字母,然后從下往下找到y字母,再找到剩下的sql。如果沒有索引,那么你可能需要a----z,如果我想找到Java開頭的單詞呢?或者Oracle開頭的單詞呢?
可以簡單理解成:排序好的快速查找數據結構,如下圖示:
結論:數據本身之外,數據庫還維護著一個滿足特定查找算法的數據結構,這些數據結構以某種方式指向數據,這樣就可以在這些數據結構的基礎上實現高級查找算法,這種數據結構就是索引。而且,一般來說索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲的磁盤上
類似大學圖書館建書目索引,提高數據檢索的效率,降低數據庫的IO成本。
通過索引列對數據進行排序,降低數據排序的成本,降低了CPU的消耗。
1.雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件每次更新添加了索引列的字段,都會調整因為更新所帶來的鍵值變化后的索引信息
2.實際上索引也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄,所以索引列也是要占用空間的。
先看如果使用B樹的索引結構
再看使用 B+樹建立索引的結構
B樹和B+樹的對比
聚簇索引并不是一種單獨的索引類型,而是一種數據存儲方式。術語‘聚簇’表示數據行和相鄰的鍵值聚簇的存儲在一起。
如下圖,左側的索引就是聚簇索引,因為數據行在磁盤的排列和索引排序保持一致。
聚簇索引的好處:
按照聚簇索引排列順序,查詢顯示一定范圍數據的時候,由于數據都是緊密相連,數據庫不不用從多個數據塊中提取數據,所以節省了大量的io操作。
聚簇索引的限制:
1.對于mysql數據庫目前只有innodb數據引擎支持聚簇索引,而Myisam并不支持聚簇索引。
2.由于數據物理存儲排序方式只能有一種,所以每個Mysql的表只能有一個聚簇索引。一般情況下就是該表的主鍵。
3.為了充分利用聚簇索引的聚簇的特性,所以innodb表的主鍵列盡量選用有序的順序id,而不建議用無序的id,比如uuid這種。
三、mysql索引分類
語法:
隨表一起建索引: CREATE TABLE customer (id INT(10) UNSIGNED AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id),KEY (customer_name) ); 單獨建單值索引: CREATE INDEX idx_customer_name ON customer(customer_name); 刪除索引: DROP INDEX idx_customer_name on customer;語法:
語法:
語法:
創建:
CREATE [UNIQUE ] INDEX [indexName] ON table_name(column))刪除:
DROP INDEX [indexName] ON mytable;查看:
SHOW INDEX FROM table_name使用ALTER命令:
有四種方式來添加數據表的索引: ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現多次。ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用于全文索引。四、哪些情況需要創建索引
- 主鍵自動建立唯一索引
- 頻繁作為查詢條件的字段應該創建索引
- 查詢中與其它表關聯的字段,外鍵關系建立索引
- 單鍵/組合索引的選擇問題, 組合索引性價比更高
- 查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度
- 查詢中統計或者分組字段
五、哪些情況不要創建索引
- 表記錄太少
- 經常增刪改的表或者字段
- Where條件里用不到的字段不創建索引
為什么:
雖然提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。
因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件
- 過濾性不好的不適合建索引
六、性能分析(explain:執行計劃)
使用EXPLAIN關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是
如何處理你的SQL語句的。分析查詢語句或是表結構的性能瓶頸。
1.表的讀取順序
2.哪些索引可以使用
3.數據讀取操作的操作類型
4.哪些索引被實際使用
5.表之間的引用
6.每張表有多少行被物理查詢
參考
總結
- 上一篇: 系统间数据传输,产品经理视角的9千字总结
- 下一篇: 基于Redis的分布式锁实现