日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql优化面试整理-吊打面试官

發布時間:2024/1/8 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql优化面试整理-吊打面试官 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. MySQL有哪些存儲引擎,各有什么特點

  • InnoDB
    MySQL5.5以后的默認引擎,支持行鎖、事務和外鍵,并發寫性能高,適合讀寫較多的業務場景。
  • MyISAM
    MySQL5.5之前的默認引擎,不支持行鎖、事務和外鍵,支持表鎖,并發寫性能較低,訪問速度較快。適合以讀和插入為主的業務場景。不適合修改和刪除較多的業務場景。
  • Memory
    數據存放在內存中,容易丟失數據。基本上用不到該引擎,可以用Redis等緩存中間件替代。

2. MySQL的索引結構

B+Tree

特點:所有的數據都存在葉子節點,并且相鄰的葉子節點都有指針鏈接。

3. 索引分類

  • 聚集索引
    一般是主鍵,索引和數據存儲在一起,葉子節點保存行數據。
    如果表沒有主鍵,MySQL會以第一個唯一索引作為聚集索引。
    如果表也沒有唯一索引,MySQL會自動創建一個rowId作為隱藏的聚集索引。
  • 非聚集索引
    我們手動創建的索引一般都是非聚集索引,索引和數據分開存儲,葉子節點保存行對應的主鍵。

延申問題:加入一個表有主鍵Id,字段a、字段b、字段c組成,其中A和B建立了聯合索引,那么select Id,a,b,c where a=‘1’,是否可以進行優化?
答:可以的,目前的方案由于a和b建立了索引,那么查詢a的時候也能在索引中查詢到b,而索引的葉子節點存儲的是主鍵,那么Id也可以一次性查出來。而c字段沒有索引,葉子節點也不會存儲c字段,那么就需要根據葉子節點關聯到的主鍵通過聚集索引去查詢行數據,造成了回表查詢。
優化方案就是:a、b、c一起建立聯合索引,就可以一次查出id,a,b,c四個字段了,避免了回表查詢。

4. 索引的設計原則

  • 針對于數據量較大,且查詢比較頻繁的表建立索引。
  • 針對于常作為查詢條件(where)、排序(order by)、分組(group by)操作的字段建立索引。
  • 盡量選擇區分度高的列作為索引,盡量建立唯一索引,區分度越高,使用索引的效率越高。
  • 如果是字符串類型的字段,字段的長度較長,可以針對于字段的特點,建立前綴索引。
  • 盡量使用聯合索引,減少單列索引,查詢時,聯合索引很多時候可以覆蓋索引,節省存儲空間,避免回表,提高查詢效率。
  • 要控制索引的數量,索引并不是多多益善,索引越多,維護索引結構的代價也就越大,會影響增刪改的效率。
  • 如果索引列不能存儲NULL值,請在創建表時使用NOT NULL約束它。當優化器知道每列是否包含NULL值時,它可以更好地確定哪個索引最有效地用于查詢。
  • 5. 索引使用原則

    最左前綴法則
    指的是查詢從索引的最左前列開始,并且不跳過中間的列。

    避免索引失效
    索引失效的幾種情況:

    • 模糊查詢%在前面
    • 在索引列上進行計算操作,比如截取字符串
    • 范圍查詢大于或小于,大于或小于右邊的列索引會失效(可用大于等于或小于等于代替)
    • or鏈接的查詢,or前后字段都要有索引,否則索引會失效
    • 字符串字段要使用引號,否則索引失效
    • 數據分布范圍較小,索引可能失效(比如性別字段建立索引,90條是男10條是女,這時候可能不會用到索引)

    覆蓋索引
    盡量使用覆蓋索引, 覆蓋索引就是只查詢建立索引的字段,減少使用select * (逐漸查詢除外),避免回表查詢。

    前綴索引
    當字段類型為varchar、text等時,有時候需要索引很長的字符串,這會讓索引變得很大,查詢時,浪費大量的磁盤O,影響查詢效率。此時可以只將字符串的一部分前綴,建立索引,這樣可以大大節約索引空間,從而提高索引效率。

    復合索引
    盡量使用復合索引,少使用單列索引。如果a,b,c都只創建了單列索引,那么mysql只會選擇最優的一個索引使用,而不會把三個字段的索引都用上。如果a,b,c創建了聯合索引,那么他們三個字段都會用到索引去查詢。

    6. SQL性能分析

    1. 慢查詢日志
    配置文件中開啟慢查詢日志,沒有性能問題的話,可以不用開啟,因為記錄慢查詢日志也是會耗費時間的。

    ##開啟慢查詢日志 slow_query_log=1##設置慢查詢日志時間為2秒,默認10秒,單位:秒 long_query_time=2

    2. profile關鍵字
    通過該關鍵字可以分析出,慢查詢具體慢到哪里了。可能的原因有查詢結果太大,內存不夠用,需要借助磁盤空間、產生了臨時表、復制內存中的臨時表到磁盤、出現了鎖等。

    ##假如這是一條慢查詢sql SELECT * FROM pms_sku_info WHERE sku_name LIKE '%Apple iPhone 13 (A2634) 星光色 128%'; ##查看執行時間和Query_Id show profiles; ##根據query_id具體分析時間花費在哪里了 show profile for query query_id; ##根據query_id查看sql的cpu使用情況 show profile cpu for query query_id;

    3.explain關鍵字
    通過該關鍵字可以分析sql執行的計劃,在查詢語句前加上該關鍵字即可。一些重要指標供參考分析,比如type字段可以看出sql的執行效率、possible_key列出可能會用到的索引、key列出實際用到的索引、rows掃描行數、filtered返回行數與讀取行數的百分比等。

    總結

    以上是生活随笔為你收集整理的mysql优化面试整理-吊打面试官的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。