1.數(shù)據(jù)庫(kù)的三大范式
https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html
1.1第一范式:每個(gè)列都不可以再拆分。(保證數(shù)據(jù)庫(kù)每一列的原子性)
1.2第二范式:在第一范式的基礎(chǔ)上,非主鍵列完全依賴于主鍵,而不能是依賴于主鍵的一部分。(保證每一列與的數(shù)據(jù)都與主鍵相關(guān))
1.3第三范式:在第二范式的基礎(chǔ)上,非主鍵列只依賴于主鍵,不依賴于其他非主鍵。(確保每列都和主鍵列直接相關(guān),而不是間接相關(guān))
2.MySQL權(quán)限表
https://www.cnblogs.com/keme/p/10288168.html
2.1數(shù)據(jù)庫(kù)權(quán)限的級(jí)別
全局性的管理權(quán)限: 作用于整個(gè)MySQL實(shí)例級(jí)別
數(shù)據(jù)庫(kù)級(jí)別的權(quán)限: 作用于某個(gè)指定的數(shù)據(jù)庫(kù)上或者所有的數(shù)據(jù)庫(kù)上
數(shù)據(jù)庫(kù)對(duì)象級(jí)別的權(quán)限:作用于指定的數(shù)據(jù)庫(kù)對(duì)象上(表、視圖等)或者所有的數(shù)據(jù)庫(kù)對(duì)象上
2.2數(shù)據(jù)庫(kù)表
分別為user表,db表,tables_priv表,columns_priv表
(一)user權(quán)限表:記錄允許連接到服務(wù)器的用戶帳號(hào)信息,里面的權(quán)限是全局級(jí)的。
(二)db權(quán)限表:記錄各個(gè)帳號(hào)在各個(gè)數(shù)據(jù)庫(kù)上的操作權(quán)限。
(三)table_priv權(quán)限表:記錄數(shù)據(jù)表級(jí)的操作權(quán)限。
(四)columns_priv權(quán)限表:記錄數(shù)據(jù)列級(jí)的操作權(quán)限。
2.3數(shù)據(jù)庫(kù)權(quán)限驗(yàn)證的流程
(一)身份驗(yàn)證:先從user表中的Host,User,Password這3個(gè)字段中判斷連接的ip、用戶名、密碼是否存在,存在則通過(guò)驗(yàn)證。
(二)權(quán)限驗(yàn)證:通過(guò)身份認(rèn)證后,進(jìn)行權(quán)限分配,按照user,db,tables_priv,columns_priv的順序進(jìn)行驗(yàn)證。即先檢查全局權(quán)限表user,如果user中對(duì)應(yīng)的權(quán)限為Y,則此用戶對(duì)所有數(shù)據(jù)庫(kù)的權(quán)限都為Y,將不再檢查db, tables_priv,columns_priv;如果為N,則到db表中檢查此用戶對(duì)應(yīng)的具體數(shù)據(jù)庫(kù),并得到db中為Y的權(quán)限;如果db中為N,則檢查tables_priv中此數(shù)據(jù)庫(kù)對(duì)應(yīng)的具體表,取得表中的權(quán)限Y,以此類推。
3char與varchar的區(qū)別
VARCHAR用于存儲(chǔ)可變長(zhǎng)字符串,它比定長(zhǎng)類型更節(jié)省空間。
VARCHAR使用額外1或2個(gè)字節(jié)存儲(chǔ)字符串長(zhǎng)度。列長(zhǎng)度小于255字節(jié)時(shí),使用1字節(jié)表示,否則使用2字節(jié)表示。
VARCHAR存儲(chǔ)的內(nèi)容超出設(shè)置的長(zhǎng)度時(shí),內(nèi)容會(huì)被截?cái)唷?br>
CHAR是定長(zhǎng)的,根據(jù)定義的字符串長(zhǎng)度分配足夠的空間。
CHAR會(huì)根據(jù)需要使用空格進(jìn)行填充方便比較。
CHAR適合存儲(chǔ)很短的字符串,或者所有值都接近同一個(gè)長(zhǎng)度。
CHAR存儲(chǔ)的內(nèi)容超出設(shè)置的長(zhǎng)度時(shí),內(nèi)容同樣會(huì)被截?cái)唷?/p>
4.使用枚舉ENUM
https://blog.csdn.net/qq_41725214/article/details/79771842
使用枚舉,底層利用數(shù)據(jù)進(jìn)行存儲(chǔ),效率更高
5.innoDB與MyISAM存儲(chǔ)引擎
(一)innoDB與MyISAM存儲(chǔ)引擎區(qū)別:
1.對(duì)事務(wù)的支持不同,innoDB支持ACID事務(wù),MyISAM不支持事務(wù)
2.采用的鎖級(jí)別不同,innoDB支持行鎖與表鎖,MyISAM只支持表鎖
3.對(duì)外鍵的支持不同,innoDB支持外鍵,MyISAM不支持外鍵
(二)innoDB索引與MyISAM索引的區(qū)別
1.索引類型不同,InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
2,索引葉子節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)不同,InnoDB的主鍵索引的葉子節(jié)點(diǎn)存儲(chǔ)著行數(shù)據(jù),因此主鍵索引非常高效。MyISAM索引的葉子節(jié)點(diǎn)存儲(chǔ)的是行數(shù)據(jù)地址,需要再尋址一次才能得到數(shù)據(jù)。
InnoDB非主鍵索引的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵和其他帶索引的列數(shù)據(jù),因此查詢時(shí)做到覆蓋索引會(huì)非常高效。
6聚簇索引與非聚簇索引
https://www.cnblogs.com/jiawen010/p/11805241.html
7索引
(一)索引是一種特殊的數(shù)據(jù)結(jié)構(gòu),一般采用B樹或者B+樹,索引可以加快數(shù)據(jù)的查找與更新速度
(二)索引的優(yōu)缺點(diǎn)
索引的優(yōu)點(diǎn)
可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。
通過(guò)使用索引,可以在查詢的過(guò)程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
索引的缺點(diǎn)
時(shí)間方面:創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,具體地,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),會(huì)降低增/改/刪的執(zhí)行效率;
空間方面:索引需要占物理空間。
8覆蓋索引
如果對(duì)查詢的字段都建立了索引,那么在查詢的過(guò)程中直接通過(guò)索引就可以訪問到數(shù)據(jù),而不需要訪問原始的數(shù)據(jù)表,這就叫做覆蓋索引,因此我們需要盡可能的在select后只寫必要的查詢字段,以增加索引覆蓋的幾率。
9 索引的分類
(一)主鍵索引: 數(shù)據(jù)列不允許重復(fù),不允許為NULL,一個(gè)表只能有一個(gè)主鍵。
(二)唯一索引: 數(shù)據(jù)列不允許重復(fù),允許為NULL值,一個(gè)表允許多個(gè)列創(chuàng)建唯一索引。
可以通過(guò) ALTER TABLE table_name ADD UNIQUE (column); 創(chuàng)建唯一索引
可以通過(guò) ALTER TABLE table_name ADD UNIQUE (column1,column2); 創(chuàng)建唯一組合索引
(三)普通索引: 基本的索引類型,沒有唯一性的限制,允許為NULL值。
可以通過(guò)ALTER TABLE table_name ADD INDEX index_name (column);創(chuàng)建普通索引
可以通過(guò)ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);創(chuàng)建組合索引
(四)全文索引: 是目前搜索引擎使用的一種關(guān)鍵技術(shù)。
可以通過(guò)ALTER TABLE table_name ADD FULLTEXT (column);創(chuàng)建全文索引
10 B+樹,B樹,hash索引的性質(zhì)
(一)B+樹
(1)非葉子節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),只用作索引
(2)每個(gè)節(jié)點(diǎn)包含n個(gè)關(guān)鍵字,每個(gè)關(guān)鍵字代表一個(gè)子樹,該關(guān)鍵字是其字?jǐn)?shù)中最大的節(jié)點(diǎn)值
(3)所有的葉子節(jié)點(diǎn)按照關(guān)鍵字的依次相連
(二)B樹
(1)可以將鍵和值存放在內(nèi)部節(jié)點(diǎn)和葉子節(jié)點(diǎn),葉子節(jié)點(diǎn)沒有相連。把頻繁訪問的數(shù)據(jù)放在靠近根節(jié)點(diǎn)的地方將會(huì)大大提高熱點(diǎn)數(shù)據(jù)的查詢效率
(三)Hash索引
(1)使用hash表存儲(chǔ)數(shù)據(jù),key為數(shù)據(jù)計(jì)算出的hash值,value為數(shù)據(jù)值,若hash沖突,在對(duì)應(yīng)Hash鍵下以鏈表形式存儲(chǔ)
11.創(chuàng)建索引的原則
(一)創(chuàng)建索引的原則
(1)對(duì)于頻繁查詢的數(shù)據(jù),適合創(chuàng)建索引
(2)非空字段:應(yīng)該指定列為NOT NULL,在mysql中,含有空值的列很難進(jìn)行查詢優(yōu)化,因?yàn)樗鼈兪沟盟饕?、索引的統(tǒng)計(jì)信息以及比較運(yùn)算更加復(fù)雜。
(3)要注意最左前綴匹配原則,防止索引失效
(4)外健一定要建立索引
(4)對(duì)于長(zhǎng)字段建立索引,要指定前綴長(zhǎng)度
(二)你適合建立索引
(1)對(duì)于頻繁更新或者修改的字段,不適合建立索引
(2)對(duì)于text,BLOB,bit類型的數(shù)據(jù)列不適合建立索引
(3)對(duì)于區(qū)分度不大的列不適合建立索引
12.創(chuàng)建索引與刪除索引
(一)創(chuàng)建索引
(1)建表時(shí)創(chuàng)建索引
CREATE TABLE user_index (
id INT auto_increment PRIMARY KEY,
first_name VARCHAR (16),
last_name VARCHAR (16),
id_card VARCHAR (18),
information text,
KEY name (first_name, last_name),
FULLTEXT KEY (information),
UNIQUE KEY (id_card)
);
(2)修改表時(shí)
ALTER TABLE table_name ADD INDEX index_name(column_list);
ALTER TABLE用來(lái)創(chuàng)建普通索引、UNIQUE索引或PRIMARY KEY索引。索引名可以省略,會(huì)自動(dòng)將所索引列中第一類作為索引名
(3)單獨(dú)創(chuàng)建
CREATE INDEX index_name ON table_name (column_list);
該方法不能創(chuàng)建主鍵索引
(二)刪除索引
ALTER TABLE drop KEY index_name;
對(duì)于主鍵索引,需要先改變其自增長(zhǎng)特定,然后才能夠刪除
alter table user_index MODIFY id int,
drop PRIMARY KEY
13.前綴索引的建立
對(duì)于長(zhǎng)文本字段需要建立前綴索引,避免字段內(nèi)所有的內(nèi)容都建立索引,使得索引的體積過(guò)大。
建立索引時(shí),可以先查詢?cè)撟侄蔚钠骄ヅ涠?/p>
select count(*)/count(distinct left(password,prefixLen));
通過(guò)從調(diào)整prefixLen的值(從1自增)查看不同前綴長(zhǎng)度的一個(gè)平均匹配度,越接近1,索引的區(qū)分度越好