資料庫 sql調優思路

2021-10-09 14:03:20 字數 2585 閱讀 3903

經常都會被問到或者與遇到資料庫調優的問題,我的一般思路如下:

1)首先是資料量,需不需要分庫分表;

2)第二是需不需要使用快取技術,快取一些熱資料。

3)第三是sql優化,如果sql太複雜了,那我一般會用到explain分析sql的執行計畫,優化sql;

4)第四選擇索引

5)還有些讀寫分離、網路頻寬的東西。

對where和order by後面的條件列進行分析,看是否有建索引的必要,要建是建那種索引:普通索引、唯一索引、全文索引或者單行索引、復合索引。

1. 查詢語句的優化,首先考慮在where和order by後的條件建立索引

2. 不要在where後的設定過索引的字段使用=和<>等符號,引擎會放棄索引進而全表掃瞄

3. 盡量避免在where子句中使用or,乙個欄位有索引,乙個字段沒有索引,引擎也會放棄索引進行全盤掃瞄。or可以用union all替代。

4. in和not in的使用也會造成全表掃瞄,in 和 not in也可以用exists 和not exists代替。如:

select num from a where num in(select num from b)替換為
select num from a where exists(select 1 from b where num=a.num)會提高效率
5. 注意like的使用,'%?%' 和'?%'效率肯定是有區別的

6. 避免在where子句中對字段進行函式操作和表示式計算

7. 任何地方都不要使用 select * from * ,用具體的字段列表代替「*」

8. sql不要返回任何用不到的字段。

1. 少用null,最好使用not null來填充資料庫,可以設定預設值的都設定預設值。比如:設定訂單資料的初始訂單狀態:待支付;訊息的狀態為:已傳送。

2. 充分考慮字段型別和字段長度

針對百萬級別以上的資料表,再考慮分庫分表。幾萬條、十幾萬條資料,就先不要考慮這些了。

拆分方式:

(1)垂直拆分

· 垂直分表:

基於列拆分資料。一般是表中的字段較多,將不常用的、 資料較大的、長度較長的列拆分到「擴充套件表「。

· 垂直分庫:

垂直分庫針對的是乙個系統中的不同業務,比如說user乙個庫,product乙個庫,order乙個庫,activity乙個庫,shopcar乙個庫。切分後,要放在多個伺服器上,而不是乙個伺服器上。為什麼? 我們想象一下,乙個購物**對外提供服務,會有使用者,商品,訂單等的crud。沒拆分之前, 全部都是落到單一的庫上的,這會讓資料庫的單庫處理能力成為瓶頸。按垂直分庫後,如果還是放在乙個資料庫伺服器上, 隨著使用者量增大,這會讓單個資料庫的處理能力成為瓶頸,還有單個伺服器的磁碟空間,記憶體,tps等非常吃緊。 所以我們要拆分到多個伺服器上,這樣上面的問題都解決了,以後也不會面對單機資源問題。            

資料庫業務層面的拆分,和服務的「治理」,「降級」機制類似,也能對不同業務的資料分別的進行管理,維護,監控,擴充套件等。 資料庫往往最容易成為應用系統的瓶頸,而資料庫本身屬於「有狀態」的,相對於web和應用伺服器來講,是比較難實現「橫向擴充套件」的。 資料庫的連線資源比較寶貴且單機處理能力也有限,在高併發場景下,垂直分庫一定程度上能夠突破io、連線數及單機硬體資源的瓶頸。

(2) 水平拆分

· 水平分表

針對資料量巨大的單張表(比如訂單表),按照某種規則(range,hash取模等),切分到多張表裡面去。 每張表都是相同的資料結構,而且這些表還是在同乙個庫中,所以庫級別的資料庫操作還是有io瓶頸。

·  水平分表分庫

水平分庫分表較之水平分表類似,也是將資料量巨大的單張表,按照某種規則切分到多張表裡去,每張表都有相同的資料結構,但是這些資料不在同乙個資料庫裡。這樣易於突破瓶頸壓力--比如io的壓力,連線數的壓力。

·  分庫分表的常用的切分規則

2. 按照日期分表,我上家公司的訂單表,就是一天一張表。較之取模相對科學。

3. 按照range分表,從0到10000乙個表,10001到20000乙個表

分庫分表後會產生事務支援、跨庫join的問題,要拉取某乙個使用者的全部訂單資料列表非常麻煩。還會產生大量的**。這個時候就需要中介軟體去治理資料,我使用到的是mycat。

為了減少單伺服器和單庫的io瓶頸、連線數壓力。我們一般採用讀寫分離的模式:主寫從讀。

這個地方我曾經遇到過乙個坑,主庫資料同步到從庫是需要時間的,主庫里訂單資料變更成已支付,但是從庫訂單資料仍然是待支付,導致我讀資料出來仍是待支付返回給了使用者。

如何解決?可以借助redis快取中介軟體,將更新的(此種操作都會發生在主庫操作上)資料按照 使用者id+業務id+其他業務維度做成key,並將其儲存在redis中,設定失效時間就是1秒;從庫做查詢時按照上述key去redis中查詢如果存在則讀取主庫,如果不存在說明資料已經同步到了從庫直接查從庫即可。

SQL資料庫調優

sql調優的方法 1.1 減少資料的訪問 1 建立並使用正確的索引 2 只通過索引訪問資料 3 優化sql執行計畫 1.2 返回更少的資料 1 資料分頁處理 2 只返回需要的字段 1.3 減少互動的次數 1 batch dml 2 in list 3 設定fetch size 4 使用儲存過程 5 ...

資料庫調優

1 資料庫調優 計算機硬體調優 資料庫物件的放置策略 利用資料庫分割槽技術,均勻地把資料分布在系統的磁碟中,平衡i o 訪問,避免i o 瓶 頸 使用磁碟硬體優化資料庫 基本表設計優化 第三正規化的基本特徵 是非主鍵屬性只依賴於主鍵屬性。優點 一是能消除 冗餘資料 節省磁碟儲存空間 二是有良好的資料...

資料庫調優

檢視資料庫連線個數 show global variables like max connections 資料庫連線不上可能是max connections數太少了 增加連線數 配置檔案 etc my.cnf.d server.cnf mysqld mysqld max connections 10...