1. 程式人生 > >阿里P7架構師談:MySQL慢查詢優化、索引優化、以及表等優化總結

阿里P7架構師談:MySQL慢查詢優化、索引優化、以及表等優化總結

MySQL優化概述

MySQL資料庫常見的兩個瓶頸是:CPU和I/O的瓶頸。

CPU在飽和的時候一般發生在資料裝入記憶體或從磁碟上讀取資料時候

磁碟I/O瓶頸發生在裝入資料遠大於記憶體容量的時候,如果應用分佈在網路上,那麼查詢量相當大的時候那麼平瓶頸就會出現在網路上。

我們可以用mpstat, iostat, sar和vmstat來檢視系統的效能狀態。除了伺服器硬體的效能瓶頸,對於MySQL系統本身,我們可以使用工具來優化資料庫的效能。

MySQL優化方案

Mysql的優化,大體可以分為三部分:索引的優化,sql語句的優化,表的優化

阿里P8架構師談:MySQL慢查詢優化、索引優化、以及表等優化總結

索引優化

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.索引優化

  • 只要列中含有NULL值,就最好不要在此例設定索引,複合索引如果有NULL值,此列在使用時也不會使用索引
  • 儘量使用短索引,如果可以,應該制定一個字首長度
  • 對於經常在where子句使用的列,最好設定索引,這樣會加快查詢速度
  • 對於有多個列where或者order by子句的,應該建立複合索引
  • 對於like語句,以%或者‘-’開頭的不會使用索引,以%結尾會使用索引
  • 儘量不要在列上進行運算(函式操作和表示式操作)
  • 儘量不要使用not in和<>操作

SQL慢查詢的優化

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.優化原則

  • 查詢時,能不要*就不用*,儘量寫全欄位名
  • 大部分情況連線效率遠大於子查詢
  • 多使用explain和profile分析查詢語句
  • 檢視慢查詢日誌,找出執行時間長的sql語句優化
  • 多表連線時,儘量小表驅動大表,即小表 join 大表
  • 在千萬級分頁時使用limit
  • 對於經常使用的查詢,可以開啟快取

資料庫表優化

  • 表的欄位儘可能用NOT NULL
  • 欄位長度固定的表查詢會更快
  • 把資料庫的大表按時間或一些標誌分成小表
  • 將表拆分

資料表拆分:主要就是垂直拆分和水平拆分。

水平切分:將記錄雜湊到不同的表中,各表的結構完全相同,每次從分表中查詢, 提高效率。

垂直切分:將表中大欄位單獨拆分到另外一張表, 形成一對一的關係。

總之:

Mysql的優化主要就在於:索引的優化,sql語句的優化,表的優化,在高併發網路環境下,除了優化資料庫外,還會涉及到分散式快取,CDN,資料庫讀寫分離等高併發優化技術。

以上就是MySQL的優化技術方案,以下是最新阿里P7架構師談架構設計系列

加群:878249276,獲取往期Java高階架構資料、原始碼、筆記、視訊 Dubbo、Redis、Netty、zookeeper、Spring cloud、分散式、高併發等架構技術

最新阿里P7架構師系列資料