MySQL 優化一(高階篇)

huxiaobai_001發表於2020-04-10

前邊我們瞭解了MyIsam和InooDB兩種引擎的鎖 現在先說說兩種引擎的區別適合幹什麼?

MyIsam引擎適合做的:
(它不支援事務,也不支援外來鍵,尤其是訪問速度快,對事務完整性沒有要求或者以SELECT、INSERT為主的應用基本都可以使用這個引擎來建立表)
其他資料結解釋:
1.選擇密集型的表。MyISAM儲存引擎在篩選大量資料時非常迅速,這是它最突出的優點。
2.插入密集型的表。MyISAM的併發插入特性允許同時選擇和插入資料。例如:MyISAM儲存引擎很適合管理郵件或Web伺服器日誌資料。
InooDB引擎適合做的:
InnoDB儲存引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比MyISAM的儲存引擎,InnoDB寫的處理效率差一些並且會佔用更多的磁碟空間以保留資料和索引。
其他資料的解釋:
1.更新密集的表。InnoDB儲存引擎特別適合處理多重併發的更新請求。
2.事務。InnoDB儲存引擎是支援事務的標準MySQL儲存引擎。
3.自動災難恢復。與其它儲存引擎不同,InnoDB表能夠自動從災難中恢復。
4.外來鍵約束。MySQL支援外來鍵的儲存引擎只有InnoDB。
5.支援自動增加列AUTO_INCREMENT屬性

mysql效能下降的原因?

根本:sql執行慢要麼就是cpu計算複雜 要麼就是頻繁的IO開銷
1.首先進入linux打top 看看是否是記憶體不夠 cpu佔滿 磁碟滿了 或者其他硬體方面的原因!這些排除了再去找sql的原因!
2.假設真的排除了上邊的原因 那麼我們再去找sql的原因
一般效能下降sql慢的原因:
執行時間長 或者 等待時間長
導致執行時間或者查詢時間長的原因是:
a.查詢語句寫的爛(解釋:各種子查詢 各種join 函式等導致索引失效或者根本沒建立索引 就會跑的賊慢)
b.索引失效(
解釋:建立了但是沒用上
索引分為單值索引和複合索引:
單值索引:
假設表當中有100萬條資料 我們從中查詢一條 我們可以為name欄位建立索引 建立了索引也就是 做了標記 查詢會非常的快;
select * from users where name = ‘’;
這種情況下我們就可以為name欄位建立索引:
//index表示索引
//idx_users_name索引名稱 通常這麼定義: idx字首表示索引users哪張表name這個表的哪個字 段 當然我們也可以命名成別的名稱也行 但是這樣更加規範
//on users(name) 表示是為表當中的哪個欄位建立索引
create index idx_users_name on users(name);//關鍵詞:建立索引
複合索引:
假設我們現在要按照兩個欄位進行搜尋
select * from users where name=’’ and password=’’;
經常會有組合在一起的欄位需要進行查詢 那麼此刻我們就可以建立複合索引
create index idx_users_namepassword on users(name,password);//關鍵詞:建立索引
這樣就建立了複合索引 當name和password同時查的時候就會用到我們建立好的複合索引

c.關聯查詢太多join(
解釋:設計缺陷或者不得已的需求
太多表的join關聯和巢狀的子查詢都會造成查詢慢的情況發生!
)
d.伺服器調優以及各個引數配置(緩衝 執行緒數等)

sql的執行順序:sql的執行順序:

使用者手寫的sql順序:

sql自己內部的執行順序:

索引:

什麼是索引?
mysql官方定義索引:索引是幫助mysql高效獲取資料的資料結構
本質:索引是一種資料結構
索引的目的:在於提高查詢效率 可以類比字典
排好序的快速查詢資料結構就是索引!
索引兩大功能:
查詢和排序 也就是說會影響到where後邊的條件查詢是否能用上索引進行快速查詢也會影響到order by 排序
索引的優勢和劣勢:

索引得是刪了建 建了刪的一個過程 我們得根據使用者的搜尋習慣來不聽的更新索引!並不是一層不變的
索引的分類和建立:
一般建議建立的是複合索引 當然也分情況 如果一個欄位被搜尋的次數很多頻率很高那麼我們也可以為其建立單值索引;
(建立了複合索引 但是在查詢的時候我們只用到了其中的一個索引 也是可以的 也是有效的哦!)
一張表索引的個數最多最好不要超過5個 這是中規中矩的做法!


什麼情況下適合建立索引什麼時候不適合建立索引:

注意:
表當中記錄很少幾千幾萬的就不要建立索引了 因為mysql資料庫這點資料量還是吼得住的!
如果一個欄位的重複值非常多 也不要建立索引 因為建立了也沒用!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

胡軍

相關文章