數據庫優化,這幾種情況不是簡單加索引就能解決的

在平時的工作中,在對公司慢查詢日誌做優化的時候,很多時候可能是忘了建索引,這時候很簡單,加個索引就行了。但是有幾種情況就不是簡單加索引能解決了:

超大分頁

在慢查詢日誌中發現了一些超大分頁的慢查詢如 Limit 40000,1000,因爲 MySQL 的分頁是在 Server 層做的,可以採用延遲關聯在減少回表。

但是看了相關的業務代碼正常的業務邏輯是不會出現這樣的請求的,所以很有可能是有惡意用戶在刷接口,最好在開發的時候也對接口加上校驗攔截這些惡意請求。

 

業務代碼循環讀數據庫

考慮這樣一個場景,獲取用戶粉絲列表信息,加入分頁是十個,其實像這樣的 SQL 是十分簡單的,通過連表查詢性能也很高。

但是有時候,很多開發採用了取出一串 ID,然後循環讀每個 ID 的信息,這樣如果 ID 很多對數據庫的壓力是很大的,而且性能也很低。

 

統計 SQL

很多時候,業務上都會有排行榜這種,發現公司有很多地方直接採用數據庫做計算,在對一些大表做聚合運算的時候,經常超過五秒,這些 SQL 一般很長而且很難優化。

像這種場景,如果業務允許(比如一致性要求不高或者是隔一段時間才統計的),可以專門在從庫裏面做統計。另外我建議還是採用 Redis 緩存來處理這種業務。

 

另外,Mysql優化可以說是面試必問,在此,彙總mysql優化的14條建議~

1. 避免使用 select *

2. 當你只需要查詢出一條數據的時候,要使用 limit 1

3. 建數據庫表時,給字段設置固定合適的大小

4. 建立高性能的索引

5. EXPLAIN 你的 SELECT 查詢

6. 要儘量使用not null

7. 在Join表的時候,被用來Join的字段,應該是相同的類型的,且字段應該是被建過索引的。

8. 不建議使用%前綴模糊查詢,這種查詢會導致索引失效而進行全表掃描

9. 要慎用in和 not in

10. 垂直分割

11.避免在where子句中對字段進行表達式操作

12.應儘量避免在 where 子句中使用 !=或<> 操作符

13.應儘量避免在 where 子句中對字段進行 null 值 判斷

14.應儘量避免在 where 子句中使用 or 來連接條

 

還總結了一些常被問到的mysql相關面試題,分享給大家~

1.你知道哪些MySQL存儲引擎?

2.常見的存儲引擎都適用於哪些場景?

3.InnoDB和MyISAM的區別有哪些?

4、InnoDB和MyISAM,select  count(*)哪個更快,爲什麼?

5、MyISAM Static和MyISAM Dynamic有什麼區別?

6.char和varchar的區別是什麼?

7.varchar(10)和int(10)分別有什麼含義?

8.MySQL的binlog有幾種錄入格式,它們之間有什麼區別?

9.如何在Unix和MySQL時間戳之間進行轉換?

10.怎樣才能找出最後一次插入時分配了哪個自動增量?

11.列設置爲AUTO INCREMENT時,如果在表中達到最大值,會發生什麼情況?

12.MySQL中,如果一個表有一列定義爲TIMESTAMP,則會發生什麼?

13.如果要存儲用戶的密碼散列,應該使用什麼字段進行存儲?

14.什麼是索引?

15.索引有什麼優缺點?

16.索引的數據結構和什麼有關?

17.MySQL主要的索引類型有哪些?

18.在建立索引的時候,需要考慮哪些因素?

19.Hash索引和B+樹索引有什麼區別?

20.非聚簇索引一定會回表查詢嗎?

21.什麼是聯合索引?爲什麼需要注意聯合索引中的順序?

22.怎樣知道語句運行很慢的原因?

23.爲何會發生針對該列創建了索引但是在查詢的時候並沒有使用的問題?

24.你對MySQL鎖是怎麼理解的?

25.加鎖有什麼好處?

26.Mysql中有哪幾種鎖?

27.什麼是死鎖?鎖等待?通過數據庫哪些表可以監控?

28.MySQL中InnoDB引擎的行鎖是如何實現的?

29.你知道哪些優化鎖的方法?

30.什麼是事務?

31.ACID是什麼?

32.事務是如何通過日誌來實現的?

33.同時有多個事務在進行會怎麼樣?

34.MySQL的事務隔離級別有哪些?

35.InnoDB使用的是哪種隔離級別?

36.REPEATABLE READ隔離級別下 MVCC 如何工作?

37.InnoDB 如何開啓手動提交事務?

38.在 InnoDB 中設置了 autocommit=0,添加一條信息之後沒有手動執行提交操作,請問這條信息可以被查到嗎?

39.爲什麼要儘量設定一個主鍵?

40.主鍵使用自增ID還是UUID?

41.字段爲什麼要求定義爲not null?

42.explain出來的各種item的意義是什麼?

43.profile的意義以及使用場景有哪些?

44.統計過慢查詢嗎?對慢查詢都怎麼優化過?

45.說一說你能想到的sql語句優化,至少五種

46.說一說你能想到的表結構優化,至少五種

47.數據三大範式是什麼?

48.超大分頁如何處理?

49.MySQL數據庫cpu飆升到500%的話,該如何處理?

50.什麼是存儲過程?

 

獲取答案或者更多mysql內容:V信掃描下面二維碼,關注後回覆“mysql”即可~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章