一點點資料庫優化

2021-08-28 05:37:35 字數 2729 閱讀 1143

優化方向:

1、資料庫設計:

基本支援三正規化

2、新增索引:

索引原理:索引以b+tree為排序的資料結構,運用二叉樹演算法折半查詢,高效查詢,效率提公升2的n次方

[mysql例]:索引型別:主鍵索引,唯一索引,全文索引(innodb不支援),組合索引,普通索引;

執行查詢計畫 explain 檢視查詢是否使用了索引:    

如執行:explain select * from table where table.id = 1

返回列:table | type | possible_keys | key | key_len | ref | rows | extra

其中type表示是否使用索引,如type=all為全表掃瞄,type=ref 等為使用了索引

索引缺點:

建索引檔案,占用磁碟空間;

對dml(update、delete、insert)語句的效率影響,增刪改會對索引影響,因為索引要重新整理;

索引不可太多,否則嚴重影響dml操作;

建索引場景:

在where條件中經常使用的字段;

字段內容不是唯一的幾個值;

字段內容不頻繁發生變化;

3、sql語句優化:

定位慢查詢語句:

慢查詢:mysql預設10秒沒有返回結果的屬於慢查詢

修改慢查詢:

--查詢慢查詢時間

show variables like 'long_query_time';

--修改慢查詢時間

set long_query_time=1; ---但是重啟mysql之後,long_query_time依然是my.ini中的值

定位慢查詢:安全模式啟動mysql,借用大神筆記:

定位後可在日誌檔案中檢視具體慢查詢語句;

優化原則:1)避免全表掃瞄,2)避免查詢建臨時表

like :  -- like '%qwer%' ;qwer前加% 走全表掃瞄,

優化: -- like 'qwer%' 

where: 1)在where子句中使用 != 或 <>操作符,索引被棄用,會全表掃瞄,

優化: -- where id>5 or id<5

2)在where子句中使用 is null 或 is not null 判斷,索引被放棄用,會全表掃瞄,

優化:設計表時盡量不要設定預設值為null

3)where中使用or連線條件,索引被棄用,

優化:必要時可以使用 union all 代替

4)where子句使用in 或 not in 慎用,棄用索引,全表掃瞄

優化:between and 代替

5)where子句中的「=」左邊進行函式、算數運算或其他表示式運算,否則系統將可能無法正確使用索引,如:                                     --   where  num/2 = 100

優化:(函式放=號右邊)-- where num = 100*2

6)limit分頁優化,當偏移量特別時,limit效率會非常低 如:select id from tablename limit 100000,10 很慢

優化:select id from tablename order by id limit 100000,10; 很快,  因為主鍵做了索引

7)where和order by 連用時注意,如果where中用到索引列那麼order by 中將不會使用索引了,

優化:兩者都要用的話,盡量使用聯合索引

8)結果集合並 盡量使用 union all,  避免使用union

9)子查詢的效能比外連線效能慢,盡量用外連線來替換子查詢  

10)避免函式索引 如:(d上建了索引) select * from t where year(d) >= 2018;

優化:select * from t where d >= '2018-01-01';  (oracle支援函式索引,mysql不支援)

11)建立聯合索引,對order by 聯合排序效率極高

避免使用臨時表:(除非確實有需要)

1、union查詢;

2、用到temptable演算法或者是union查詢中的檢視;

3、order by和group by的子句不一樣時;

4、表連線中,order by的列不是驅動表中的;

5、distinct查詢並且加上order by時;

6、sql中用到sql_small_result選項時;

7、from中的子查詢;

8、子查詢或者semi-join時建立的表;                

4、分表分庫

垂直拆分:專案模組化,將表劃分到多個資料庫中,服務弱耦合化,用於分布式場景

水平拆分:行資料拆分到不同表中,具體根據業務需求,有的按照註冊時間、取摸、賬號規則、年份等。

這裡說下取模方式分表:(特點:資料均勻分布在各個分表中)

5、讀寫分離

請參考大神部落格:

6、儲存過程 [模組化程式設計,可以提高速度]

7、對mysql配置優化

filesort優化策略:

1.適當增大sort_buffer_size引數的設定

2.適當增大max_length_for_sort_data引數的設定

8、mysql伺服器硬體公升級

9、定時的去清除不需要的資料,定時進行碎片整理(myisam)

一點點感想

寫在這喧囂與寂寞的世界 今天我與chen在風初停的早上跑去借書,借了安妮的 清醒記 兩本三毛的書和一本yilan的旅行與味蕾的書。從圖書館出來,風似乎有些冷,想到又要到那陰冷的梅花館坐在又涼又硬的椅子上上一節乏味的數學課我們便都不約而同的想到了逃課。帶著心裡的負罪感我們躲進八食取暖。無意中我們嘗到了...

一點點感悟

這兩天一直在努力的調整狀態,考慮了很多,也想通了很多,因為看開了,所以狀態也好了很多。明白了,一件事情的兩面性,壞的一面會使自己痛苦不堪,好的一面會使自己心情愉快。看了一篇文章,感觸很大,裡面有很多啟發自己的語句。二十幾歲的人,除了愛情之外,還需要有一項能使自己生活的本領 要把自己的感觸 心情和生活...

一點點想法

最近公司要做個專案,用到進銷存系統,考查了好幾個,都不是很滿意 要麼功能上不行,要麼 上不行 突然在想,如果能用php做乙個,將是個不錯的選擇,因為進銷存大部分都是內部人使用,併發量要求並不是很高,主要是資料準確性和安全性,我想這兩方面重不在語言,另外乙個麻煩的地方是報表這塊,可以用其它語言來單獨處...