一:問題的產生:
在應用系統開發初期,由於開發資料庫資料比較少,對於查詢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...