一枢贿、數(shù)據(jù)庫(kù)索引
1.MySQL 索引可以分為單列索引瑰抵、復(fù)合索引暇榴、唯一索引橱赠、主鍵索引等
#創(chuàng)建索引的兩種方式
CREATE [UNIQUE] INDEX index_name ON table_name(index_col_name[,...]);
ALTER TABLE table_name ADD [UNIQUE] INDEX index_name ON (index_col_name[,...]);
2.關(guān)于索引使用的幾個(gè)原則
WHERE子句中的列可能最適合做為索引
不要嘗試為性別或者有無(wú)這類字段等建立索引(因?yàn)轭愃菩詣e的列尤仍,一般只含有“0”和“1”,無(wú)論搜索結(jié)果如何都會(huì)大約得出一半的數(shù)據(jù))
如果創(chuàng)建復(fù)合索引狭姨,要遵守最左前綴法則宰啦。即查詢從索引的最左前列開(kāi)始,并且不跳過(guò)索引中的列
不要過(guò)度使用索引饼拍。每一次的更新赡模,刪除,插入都會(huì)維護(hù)該表的索引师抄,更多的索引意味著占用更多的空間
使用InnoDB存儲(chǔ)引擎時(shí)漓柑,記錄(行)默認(rèn)會(huì)按照一定的順序存儲(chǔ),如果已定義主鍵叨吮,則按照主鍵順序存儲(chǔ)辆布,由于普通索引都會(huì)保存主鍵的鍵值,因此主鍵應(yīng)盡可能的選擇較短的數(shù)據(jù)類型茶鉴,以便節(jié)省存儲(chǔ)空間
不要嘗試在索引列上使用函數(shù)锋玲。
二、鎖以及事務(wù)的隔離級(jí)別
1.兩種類型的鎖
共享鎖(讀鎖)
將對(duì)象數(shù)據(jù)變?yōu)橹蛔x對(duì)象的鎖定涵叮,允許多個(gè)用戶進(jìn)程同時(shí)訪問(wèn)數(shù)據(jù)惭蹂,但在鎖釋放前無(wú)法修改數(shù)據(jù)。排他鎖(寫鎖)
在數(shù)據(jù)對(duì)象進(jìn)行變更時(shí)鎖定割粮,不允許其他用戶進(jìn)程訪問(wèn)和修改數(shù)據(jù)盾碗,保證了數(shù)據(jù)完整性。
mysql包含兩種類型的執(zhí)行引擎InnoDB和MyISAM舀瓢。InnoDB行鎖是通過(guò)給索引上的索引項(xiàng)加鎖來(lái)實(shí)現(xiàn)的廷雅,也就是說(shuō),只有通過(guò)索引條件檢索數(shù)據(jù),InnoDB才使用行級(jí)鎖榜轿,否則幽歼,InnoDB將使用表鎖。MyISAM只支持表鎖谬盐,不提供事物支持甸私,性能比InnoDB高上一些。
- mysql中的顯示加鎖語(yǔ)法
-- 共享鎖(S)
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE;
-- 排他鎖(X)
SELECT * FROM table_name WHERE ... FOR UPDATE;
# FOR UPDATE僅適用于InnoDB飞傀,且必須在交易區(qū)塊(BEGIN/COMMIT)中才能生效皇型。
# 當(dāng)使用FOR UPDATE時(shí)WHERE條件語(yǔ)句未用到索引時(shí)將造成表鎖。
- 索引選擇性:Selectivity
索引的選擇性(Selectivity)砸烦,是指不重復(fù)的索引值(也叫基數(shù)弃鸦,Cardinality)與表記錄數(shù)(#T)的比值:index Selectivity = Cardinality / #T
顯然選擇性的取值范圍為(0, 1],選擇性越高的索引價(jià)值越大幢痘,這是由B+Tree的性質(zhì)決定的唬格。簡(jiǎn)單來(lái)說(shuō)就是我們?cè)谶x擇哪些字段作為索引列的時(shí)候要考慮當(dāng)前列的數(shù)據(jù)重復(fù)率是否很高,如果數(shù)據(jù)重復(fù)率特別高那么設(shè)置索引的意義并不大颜说,反而會(huì)影響數(shù)據(jù)寫入的效率购岗。
//統(tǒng)計(jì)索引選擇性
SELECT count(DISTINCT(concat(first_name, left(last_name, 4))))/count(*) AS Selectivity FROM mem_user;
2.四種隔離級(jí)別
READ_UNCOMMITTED(讀未提交)
事物未提交時(shí)可以被其他事物讀取,會(huì)出現(xiàn)臟讀门粪、不可重復(fù)讀喊积、幻讀現(xiàn)象READ_UNCOMMITTED(讀已提交,鎖定正在讀取的行)
事物提交后可被其他事物讀取玄妈,可以避免臟讀乾吻,會(huì)出現(xiàn)不可重復(fù)讀、幻讀現(xiàn)象拟蜻。REPEATABLE_READ(可重復(fù)讀绎签,鎖定讀取的所有行,mysql默認(rèn)事物隔離級(jí)別)
可以防止臟讀瞭郑、不可重復(fù)讀辜御,但會(huì)出幻讀鸭你。SERIALIZABLE(可串行化)
事物被處理為順序執(zhí)行屈张,效率低下。
隔離級(jí)別越高袱巨,數(shù)據(jù)的完整性也就越高阁谆,但同時(shí)運(yùn)行性下降,相反如果隔離級(jí)別越低數(shù)據(jù)完整性越低愉老,同時(shí)運(yùn)行性也就提高了场绿,筆者在實(shí)際工作當(dāng)中遇到了許多關(guān)于事物隔離級(jí)別導(dǎo)致的問(wèn)題。所以在不同的應(yīng)用場(chǎng)景下設(shè)置合理的隔離級(jí)別是非常重要的嫉入。