先說一下存儲引擎
MySQL5.1.X之前默認(rèn)是MyISAM女轿,從MySQL5.5.X開始贵试,默認(rèn)存儲引擎為InnoDB Plugin
MyISAM
結(jié)構(gòu)
每個MyISAM在磁盤上會將數(shù)據(jù)存儲成三個文件蜕乡,分別是:.frm文件存儲表定義,.myd文件是數(shù)據(jù)文件屋摇,.myi文件是索引文件
特點(diǎn)
表級索偶洋、不支持事務(wù)支持全文索引
InnoDB
結(jié)構(gòu)
.frm文件存儲表定義,.idb文件存儲數(shù)據(jù)和索引文件
特點(diǎn)
行級索妓雾、支持事務(wù)娶吞、不支持全文索引
如何選擇
假如一個商城系統(tǒng),在設(shè)計訂單表和商品表時械姻,如何選擇引擎
訂單表:一般后臺操作妒蛇,對事務(wù)要求高,查詢少楷拳,用InnoDB
商品表:一般前臺展示绣夺,查詢多,用MyISAM
索引
常用索引類型一般為唯一性索引和普通索引欢揖,而索引方法有BTREE和HASH陶耍,常用BTREE,而不同引擎下對應(yīng)的結(jié)構(gòu)不同浸颓,那么其對應(yīng)的索引也就不相同了
MyISAM下的索引
MyISAM引擎使用B+Tree作為索引結(jié)構(gòu)物臂,葉子節(jié)點(diǎn)的data域存放的是數(shù)據(jù)記錄的地址,Col1為主鍵产上,上圖是主索引的原理圖
Col2建立的一個輔助索引棵磷,上圖是基索引的原理圖
MyISAM的這種索引方式叫做非聚集索引,即索引和數(shù)據(jù)分開放
InnoDB下的索引
InnoDB也使用B+Tree晋涣,但實(shí)現(xiàn)方式與MyISAM不同仪媒,InnoDB的數(shù)據(jù)文件本身就是索引文件,上圖是Col1作為主鍵的主索引的原理圖
InnoDB的輔助索引data域存儲相應(yīng)記錄主鍵的值而不是地址,即InnoDB的所有輔助索引都引用主鍵作為data域算吩,上圖為col3的輔助索引
像InnoDB這樣數(shù)據(jù)和索引都放在同一文件叫做聚集索引留凭,這種實(shí)現(xiàn)方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵偎巢,然后用主鍵到主索引中檢索獲得記錄
關(guān)于聚集索引
- 默認(rèn)拿主鍵作為聚集索引
- 如果沒有主鍵蔼夜,會去取非空唯一的索引作為聚集索引
- 如果上面都沒有,Innodb自己去維護(hù)一個唯一索引
總結(jié)
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
提高檢索速度压昼,降低IO求冷、CPU消耗
缺點(diǎn):
占空間,索引字段更新會有性能損耗
用索引
- 單表單庫窍霞,出現(xiàn)查詢性能瓶頸匠题,大概在500萬
- 排序字段
- 分組字段
不用索引
- 頻繁更新的字段不適合建立索引
- where沒有使用的字段
- 表的數(shù)據(jù)很少
- 數(shù)據(jù)重復(fù)且分布均衡的字段,如性別字段狀態(tài)字段
- 參與列計算的時候不適合建立索引
優(yōu)化思路
- 建索引
- sql解析
- 緩存
- 拆分(分庫但金,分表(垂直韭山,水平))
- scale out 水平擴(kuò)展 增加機(jī)器 集群負(fù)載 (建議)
scale up 提高服務(wù)器性能,增加CPU冷溃,增加磁盤钱磅,SSD (很有錢的基礎(chǔ)上面)