Mysql優化 一、存儲引擎 1.查看所有引擎 2.查看預設存儲引擎 3.MyISAM和InnoDB | 對比項 | MyISAM | InnoDB | | : : | : : | : : | | 主外鍵 | 不支持 | 支持 | | 事務 | 不支持 | 支持 | | 行表鎖 | 表鎖,即使操作一 ...
Mysql優化
一、存儲引擎
1.查看所有引擎
SHOW ENGINES;
2.查看預設存儲引擎
show VARIABLES LIKE '%STORAGE_engine%';
3.MyISAM和InnoDB
對比項 | MyISAM | InnoDB |
---|---|---|
主外鍵 | 不支持 | 支持 |
事務 | 不支持 | 支持 |
行表鎖 | 表鎖,即使操作一條記錄也會鎖住整個表,不適合高併發的操作 | 行鎖,操作時只鎖某一行,不對其他行有影響,適合高併發的操作 |
緩存 | 只緩存索引,不緩存真實數據 | 不僅緩存索引還要緩存真實數據,對記憶體的要求較高,而且記憶體的大小對其性能有決定性的影響 |
表空間 | 小 | 大 |
關註點 | 性能 | 事務 |
預設安裝 | YES | YES |
二、SQL執行載入順序
From left_table
on join_condition
<join_type> join right_table
where where_condition
group by group_condition
having having_condition
select
distinct select_list
order by orderBy_condtion
limit limit_num
三、索引
1.定義
索引是幫助Mysql高效獲取數據的數據結構。——>本質:數據結構。
其目的在於提高查詢效率,可以類比於字典,可以簡單理解為排好序的快速查找數據結構。
數據本身之外,資料庫還維護著一個滿足特定查找演算法的數據結構,這些數據結構以某種方式指向數據,這樣就可以在這些數據結構的基礎上實現高級查找演算法,這種數據結構就是索引。
通常說的索引如果沒有特別指明,說的都是B樹(多路搜索樹,並不一定是二叉的)結構組織的索引。其中聚集索引、次要索引、覆蓋索引、複合索引、首碼索引、唯一索引預設都是使用B+樹索引,統稱索引。當然,除了B+樹這種類型的索引之外,還有哈希索引等
索引會影響到查找和排序
一般來說索引也很大,不可能全部存儲在記憶體中,因此索引往往以索引文件的方式存儲在磁碟上。
2.特點
優點:提高數據檢索的效率,降低了資料庫的IO成本。
通過索引對數據進行排序,降低數據排序的成本,降低了CPU的消耗。
缺點:實際上索引也是一張表,該表保存了主鍵與索引欄位,並指向實體表的記錄,所以索引也是占用空間的。
雖然其大大調高了查詢速度,同時卻會降低更新表的速度。因為更新表時不僅要保存數據,還要保存一下 索引文件每次更新添加了索引列的欄位,都會調整因為更新所帶來的鍵值變化後的索引信息。
索引只是提高效率的一個因素,如果你的資料庫擁有大量的表,就需要花時間研究建立最優秀的索引,或 優化查詢。
3.分類
單值索引
一個索引只包含單個列,一個表可以有多個單值索引。
唯一索引
索引列的值必須唯一,但允許有空值
複合索引
一個索引包含了多個列
4.基本語法
創建:UNIQUE是唯一索引, columnname只有一個是單值索引,有多個為複合索引
CREATE [UNIQUE] INDEX indexname on tablename(columnname1, columnname2...)
or
ALERT tablename add [UNIQUE] INDEX [indexname] on (columnname1, columnname2...)
刪除:
DROP INDEX [indexname] on tablename
查看
SHOW INDEX FROM tablename
5.適合建立索引的情況
- 主鍵自動建立唯一索引
- 頻繁作為查詢條件的欄位應該創建索引
- 查詢中與其他表關聯的欄位,外鍵關係建立索引
- 查詢中排序的欄位,排序欄位若通過索引去訪問,將大大提高排序速度
- 單鍵/組合索引的選擇問題(高併發適合創建組合索引)
- 查詢中統計或分組的欄位
6.不適合創建索引的情況
頻繁更新的欄位
where條件里用不到的欄位
表記錄太少
數據重覆且分佈平均的表欄位,因此應該只為最經常查詢和最經常排序的數據建立索引
索引的選擇性=不同的數目/總數目