Mysql存儲引擎分為兩種(InnoDB 跟 MyISAM )
InnoDB 支持事務(wù),MyISAM 不支持事務(wù)。
InnoDB 支持外鍵,而 MyISAM 不支持。
InnoDB 是聚集索引桐款,MyISAM 是非聚集索引。聚簇索引的文件存放在主鍵索引的葉子節(jié)點(diǎn)上患朱,因此 InnoDB 必須要有主鍵鲁僚,通過主鍵索引效率很高。但是輔助索引需要兩次查詢裁厅,先查詢到主鍵冰沙,然后再通過主鍵查詢到數(shù)據(jù)。因此执虹,主鍵不應(yīng)該過大拓挥,因?yàn)橹麈I太大,其他索引也都會很大袋励。而 MyISAM 是非聚集索引侥啤,數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針茬故。主鍵索引和輔助索引是獨(dú)立的盖灸。
InnoDB 不保存表的具體行數(shù),執(zhí)行 select count(*) from table 時需要全表掃描磺芭。而MyISAM 用一個變量保存了整個表的行數(shù)赁炎,執(zhí)行上述語句時只需要讀出該變量即可,速度很快钾腺;
InnoDB 最小的鎖粒度是行鎖徙垫,MyISAM 最小的鎖粒度是表鎖。一個更新語句會鎖住整張表放棒,導(dǎo)致其他查詢和更新都會被阻塞姻报,因此并發(fā)訪問受限。
InnoDB 支持不支持全文索引(可以使用sphinx插件支持全文索引)间螟,MyISAM 支持全文索引
Left join 左表所有數(shù)據(jù)跟右表關(guān)聯(lián)數(shù)據(jù)(部分笛卡爾積)
right join 右表所有數(shù)據(jù)跟左表關(guān)聯(lián)數(shù)據(jù)(部分笛卡爾積)
inner join 左表跟右表都有的數(shù)據(jù)(部分笛卡爾積)
Join 左表右表所有數(shù)據(jù)(笛卡爾積)
Group by 分組
having 分組后條件判斷
Order by 排序(asc 升序 desc 降序)
Limit 截取數(shù)據(jù)
執(zhí)行順序 from ->on ->Join -> where(由左到右)->group by->having->select->order by->limit
In查詢跟exists 區(qū)別
In用于條件小于表數(shù)據(jù)
Exists用于條件大于表數(shù)據(jù)
二叉樹
紅黑樹 1. 每個節(jié)點(diǎn)或者是黑色吴旋,或者是紅色损肛。 2. 根節(jié)點(diǎn)是黑色。 3. 每個葉子節(jié)點(diǎn)(NIL)是黑色荣瑟。 [注意:這里葉子節(jié)點(diǎn)荧关,是指為空(NIL或NULL)的葉子節(jié)點(diǎn)!]
4. 如果一個節(jié)點(diǎn)是紅色的褂傀,則它的子節(jié)點(diǎn)必須是黑色的。 5. 從一個節(jié)點(diǎn)到該節(jié)點(diǎn)的子孫節(jié)點(diǎn)的所有路徑上包含相同數(shù)目的黑節(jié)點(diǎn)
https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
B-Tree
B-Tree是為磁盤等外存儲設(shè)備設(shè)計(jì)的一種平衡查找樹加勤。因此在講B-Tree之前先了解下磁盤的相關(guān)知識仙辟。
系統(tǒng)從磁盤讀取數(shù)據(jù)到內(nèi)存時是以磁盤塊(block)為基本單位的,位于同一個磁盤塊中的數(shù)據(jù)會被一次性讀取出來鳄梅,而不是需要什么取什么叠国。
InnoDB存儲引擎中有頁(Page)的概念,頁是其磁盤管理的最小單位戴尸。InnoDB存儲引擎中默認(rèn)每個頁的大小為16KB粟焊,可通過參數(shù)innodb_page_size將頁的大小設(shè)置為4K、8K孙蒙、16K项棠,在MySQL中可通過如下命令查看頁的大小:
show variables like 'innodb_page_size';
Linux ( getconf PAGESIZE )
B+Tree
Hash
優(yōu)點(diǎn): 基于索引列的hash值,以key-value方式存儲到hash表中,一般情況下性能比B+Tree高
缺點(diǎn):
基于hash不能用于大于小于范圍查詢,不能排序;
聯(lián)合索引不能遵循最左前綴原則;
大量不同索引的hash值相同時,需要獲取實(shí)際數(shù)據(jù)進(jìn)行比較(數(shù)據(jù)量大是比B+Tree性能低)
聯(lián)合索引: 最左前綴原則
索引使用:
id越大,執(zhí)行順序越靠前,id相同順序由上到下
select_type 查詢類型
Table 查詢表名
Partitions 查詢的表分區(qū)
Type 常用的類型有: ALL挎峦、index香追、range、 ref坦胶、eq_ref透典、const、system顿苇、NULL(從左到右峭咒,性能從差到好)
ALL:Full Table Scan, MySQL將遍歷全表以找到匹配的行
index: Full Index Scan纪岁,index與ALL區(qū)別為index類型只遍歷索引樹
range:只檢索給定范圍的行凑队,使用一個索引來選擇行
ref: 表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值
eq_ref: 類似ref蜂科,區(qū)別就在使用的索引是唯一索引顽决,對于每個索引鍵值或粮,表中只有一條記錄匹配塔淤,簡單來說,就是多表連接中使用primary key或者 unique key作為關(guān)聯(lián)條件
const针史、system: 當(dāng)MySQL對查詢某部分進(jìn)行優(yōu)化贡定,并轉(zhuǎn)換為一個常量時赋访,使用這些類型訪問。如將主鍵置于where列表中,MySQL就能將該查詢轉(zhuǎn)換為一個常量蚓耽,system是const類型的特例渠牲,當(dāng)查詢的表只有一行的情況下,使用system
NULL: MySQL在優(yōu)化過程中分解語句步悠,執(zhí)行時甚至不用訪問表或索引签杈,例如從一個索引列里選取最小值可以通過單獨(dú)索引查找完成。
推薦優(yōu)化到ref往上
possible_keys 可能使用到的索引
Key 實(shí)際使用的索引
key_len 使用的索引長度
Ref 索引key使用的列或者常量
Rows 過濾出來結(jié)果的行數(shù)(越少越好)
Filtered 表示返回結(jié)果的行數(shù)占需讀取行數(shù)的百分比 Filtered列的值越大越好
Extra 查詢用到的信息
索引創(chuàng)建語句:
Alter table usr_user add INDEX idx_account_password
(account
,password
)
數(shù)據(jù)量大(分區(qū))最好做單表查詢(分表,分庫)