- Mysql單進(jìn)程多線程設(shè)計。
-
InnoDB優(yōu)點
- 5.5以后默認(rèn)引擎
- 行級鎖
- 支持事物
- 更好的恢復(fù)性
- 高并發(fā)下性能更好泻肯,對多核海洼、大內(nèi)存、ssd等硬件支持好休里。
mysql的InnoDB采用的索引算法
B+樹
B+樹索引
聚集索引
一個表只有一個聚集索引蛆挫,根據(jù)主鍵生成(如果設(shè)置主鍵),圖中紅色
一個葉子節(jié)點存放整行記錄二級索引(輔助索引)
非聚集索引都是二級索引妙黍,如果非主鍵查詢悴侵,會先根據(jù)二級索引找到主鍵,在根據(jù)聚集索引中查找數(shù)據(jù)拭嫁。圖中藍(lán)色可免。
一個葉子節(jié)點存放主鍵沒有索引就會進(jìn)行全表掃描。
索引是一切快速查詢的前提做粤。
索引可以提供效率浇借,但也會降低插入和更新的速度并占有磁盤空間。
單張表索引數(shù)量不要超過5個驮宴,
單個索引中的字段數(shù)不超過5個
索引操作
- 查看表的索引
show index from 表名 mysql查看表索引
Sql優(yōu)化案例
案例一
-
在sql查詢中=號左邊使用表達(dá)式逮刨,會放棄索引
查看語句執(zhí)行計劃
explain extended sql語句
* 第一個語句掃描了6行,using index,使用了索引堵泽,第二個掃描了70多萬行修己,沒有使用索引。
案例二
- machine_vc字段是varchar類型迎罗,查詢時如果使用數(shù)字睬愤,mysql會將兩邊轉(zhuǎn)換成浮點數(shù)進(jìn)行比較(隱式轉(zhuǎn)換),會放棄索引纹安。
- 為什么會放棄尤辱?machine_vc是字符串砂豌,假如“1142”、“1142@d”光督、“1142.00”是machinde_vc的值阳距,因為不能確定是否只有“1142”能滿足等于1142的要求,所以它會掃描全表结借,逐個比較筐摘,這時就不會使用B+樹索引。
- 第一個語句查詢6行船老,第二個查詢70多萬行咖熟。
案例三
- 查詢偏移量80000的id,然后再借助索引查詢
優(yōu)化
int 類型占用4個字節(jié)柳畔,而char(15)占用15個字節(jié)馍管。
in中不要使用子查詢。
不同字段OR改為Union薪韩,因為此時Union會使用不同字段的索引去查詢确沸。
Count(*)會進(jìn)行全表掃描。
復(fù)雜運算移動程序端CPU躬存。