資料庫學習高階一

2021-07-25 13:14:14 字數 3013 閱讀 2868

一:問題的產生:

在應用系統開發初期,由於開發資料庫資料比較少,對於查詢sql語句,複雜檢視的的編寫等體會不出sql語句各種寫法的效能優劣,但是如果將應用系統提交實際應用後,隨著資料庫中資料的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中乙個很重要的方面就是sql語句的優化。對於海量資料,劣質sql語句和優質sql語句之間的速度差別可以達到上百倍,可見對於乙個系統不是簡單地能實現其功能就可,而是要寫出高質量的sql語句,提高系統的可用性。

原因分析

主要原因1:後台資料庫中的資料過多,沒做資料優化導致後台查詢資料很慢

次要原因2:前端資料請求-解析-展示過程處理不當

次要原因3:網路問題所致

那麼我們應該怎麼做後台資料優化呢?

1、快取,在持久層或持久層之上做快取

使用ehcache快取,這個一般用於持久層的快取,提供持久層、業務層的快速快取,hibenate預設使用的二級快取就是ehcache;

2、資料庫表的大字段剝離

假如乙個表的字段數有100多個,學會拆分字段,保證單條記錄的資料量很小;

3、恰當地使用索引

必要時建立多級索引,分析mysql的執行計畫,通過表資料統計等方式協助資料庫走正確的查詢方式,該走索引就走索引,該走全表掃瞄就走全表掃瞄;

4、表的拆分

表分割槽和拆分,無論是業務邏輯上的拆分(如乙個月一張報表、分庫)還是無業務含義的分割槽(如根據id取模分割槽);

5、字段冗餘

減少跨庫查詢和大表連線操作;,資料通過單個或多個job生成出來,減少實時查詢;

6、從磁碟上做文章

資料存放的在磁碟的內、外磁軌上,資料獲取的效率都是不一樣的;

7、放棄關聯式資料庫的某些特性

引入nosql資料庫;

換種思路存放資料,例如搜尋中的倒排表;

在上面談到資料庫查詢速度優化方案我們講到了,資料優化的幾種方案。接下來,一起看如何實際到具體的操作上.也就是我們在寫資料時我們應該注意些什麼?

1、對查詢進行優化,應盡可能避免全表掃瞄

首先應考慮在 where 及 order by 涉及的列上建立索引。

下面我們來以乙個表中177條資料比較一下,全表掃瞄與建立索引之後效能的乙個比較.

1.1 全表查詢

select * from

table

1.2 建立索引查詢

select * from

table

where pay = 1

andorder

by enter

1.3 結論

從這兩種方式查詢資料庫結果看,建立索引之後查詢速度提高了些,現在資料量還不明顯,如果表中有10萬條速度,差異就會很明顯了.

2、寫資料語句時盡可能減少表的全域性掃瞄

2.1 減少where 字段值null判斷

select * from

table

where pay_status = null;

如何這樣做,就會導致引擎放棄使用索引而進行全表掃瞄

應該這樣去設定(也就是在沒有值時,我們在存資料庫時自動預設給個o值,而不是什麼都不寫):

select * from

table

where pay_status = 0;

2.2 應盡量避免在 where 子句中使用!=或<>操作符

select * from

table

where pay_status != 0;

select * from

table

where pay_status <> null;

這樣寫將導致引擎放棄使用索引而進行全表掃瞄。

2.3 應盡量避免在 where 子句中使用 or 來連線條件

select * from

table

where pay_status != null

or entertime = null;

這樣將導致引擎放棄使用索引而進行全表掃瞄

可以這樣操作:

select * from

table

where pay_status != null

union

allselect * from

table

where entertime = null;

2.4 in 和 not in 也要慎用

select * from

table

where rowed in [1,2,3,4];

或者select * from

table

where rowed not

in [1,2,3,4];

這樣操作,也會導致全表掃瞄

select * from

table

where rowed between 1

and5;

2.5 少使用模糊匹配like

select * from

table

where entertime like

'%2016-09-08%';

2.6 盡量避免在where子句中對字段進行表示式操作

select * from

table

where rowed/4 = 100

這樣寫將導致引擎放棄使用索引進行全盤掃瞄

select * from

table

where rowed = 4*100

任何時候都不要用萬用字元去查詢所有

以萬用字元*去查詢所有資料,這樣做也是非常耗時的,我們應該需要什麼欄位就查詢什麼欄位.

資料庫的學習與高階(一)

感謝阿里李飛飛老師的公開課程,得以對資料庫的發展有個總體認知,以下是對該課程的整理。課程內容比較多,而我屬於入門菜鳥,就根據自己的學習進度,一點點更新吧。本次主要是對資料庫的演進過程 資料庫業務視角分類 資料庫系統的核心模組的內容整理。1 商業起步階段,結構化的資料rdbms以sql oltp聯機事...

mysql資料庫高階 mysql資料庫高階

一 索引 索引,是資料庫中專門用於幫助使用者快速查詢資料的一種資料結構。類似於字典中的目錄,查詢字典內容時可以根據目錄查詢到資料的存放位置,然後直接獲取即可。分類 普通索引 唯一索引 全文索引 組合索引 主鍵索引 1 普通索引 普通索引僅有乙個功能 加速查詢 建立表時建立索引 create tabl...

資料庫高階

1.預設值 default 值 create table student id int,name varchar 20 address varchar 20 default 江西贛州 預設值 當欄位沒有插入值的時候,mysql自動給該字段分配預設值 注意,預設值的字段允許為空 insert into...