Mysql數(shù)據(jù)的優(yōu)化分為兩個(gè)部分,一個(gè)是數(shù)據(jù)庫設(shè)計(jì)上的優(yōu)化,另一個(gè)是數(shù)據(jù)庫執(zhí)行時(shí)的優(yōu)化。
數(shù)據(jù)庫設(shè)計(jì)上的優(yōu)化
有些公司對(duì)程序猿在數(shù)據(jù)庫的設(shè)計(jì)術(shù)業(yè)上沒有專門要求,但可以做一下了解,對(duì)發(fā)展肯定是有好處的。mysql數(shù)據(jù)庫的表結(jié)構(gòu)設(shè)計(jì)應(yīng)該遵從一下幾個(gè)點(diǎn):
1.建表準(zhǔn)則
1.1定長和變長字段分離(用到空間換時(shí)間理念)
????char、varchar、text、tinytext
像密碼這樣的加密文,長度是一定的,就可以使用定長字段char
1.2常用和不常用字段分離
1.3添加冗余字段提高速率(如求整數(shù))
2列選準(zhǔn)則
2.1定長優(yōu)先
整型>date,time(定長)>enum、char>varchar(花內(nèi)存開銷,索引會(huì)查詢2次)、blob
2.2值盡量不要是Null,用空字符串代替
3索引優(yōu)化
索引:專門為查詢相關(guān)設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu),指向的是數(shù)據(jù)的物理地址信息,為查詢、排序和分組提升速度,但占用磁盤空間,影響增刪改的速度
3.1實(shí)現(xiàn)方法分類
BTREE:索引樹,如二叉樹

HASH:速度更快,地址與存儲(chǔ)的主鍵根據(jù)hash算法一一對(duì)應(yīng),理論上是O1的時(shí)間維度,拿范圍結(jié)果慢、排序慢
3.2類型分類
PRIMARY(主鍵)、INDEX/Normal(無限制索引)、UNIQUE(值唯一索引,可為空)、FULLTEXT(文本索引);

3.3欄位分類
單列索引:單個(gè)字段索引
組合索引:多個(gè)字段組合,遵從左前綴原則,


可能會(huì)想用多個(gè)單列索引代替組合索引,效率上是不對(duì)等的,單列索引先將結(jié)果全返回再繼續(xù)進(jìn)行單列索引查詢,組合索引則是通過條件直接查詢符合的結(jié)果。
3.4非聚簇索引和聚簇索引
先說一下引擎,這里我們對(duì)比兩個(gè)引擎,MyISAM和InnoDB(都是BTREE索引),前者適用于查詢業(yè)務(wù)繁重的情景,后者在操作上可靠性要好一點(diǎn),事務(wù)處理優(yōu)于前者。使用show engines;查看當(dāng)前引擎。
MyISAM:非聚簇索引,即數(shù)據(jù)文件和索引文件是分離的,需要回行;索引指向行所在的位置,只有行的信息。(借助覆蓋索引可以少訪問磁盤-->組合索引的用法)
InnoDB:聚簇索引,數(shù)據(jù)文件和索引文件是在一塊的,不需要回行,因?yàn)樗饕掠袛?shù)據(jù),次級(jí)索引指向主鍵索引的位置,沒有次級(jí)索引的情況下會(huì)默認(rèn)有個(gè)rowId進(jìn)行指向。存在頁的分裂問題。所以聚簇索引是既有行也信息也有數(shù)據(jù)信息

3.5理想的索引
1.使用頻繁????2.區(qū)分度高的????3.長度小????4.盡量能覆蓋常用字段
3.6偽哈希索引(針對(duì)B-TREE索引)
? ? ? ? 哈希算法:CRC32(expr)函數(shù)
3.7索引與排序、分組
由于索引的機(jī)制,數(shù)據(jù)插入的時(shí)候就已經(jīng)存在排序問題
3.8重復(fù)索引和冗余索引
索引重復(fù)沒有存在意義,冗余索引必要時(shí)需要使用(能避免回行就避免)
3.9修復(fù)表
設(shè)計(jì)中操作時(shí)間長后導(dǎo)致數(shù)據(jù)或索引肯定存在碎片,需要修復(fù)