十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
主要有這些:
成都創(chuàng)新互聯(lián)服務(wù)項目包括蒲江縣網(wǎng)站建設(shè)、蒲江縣網(wǎng)站制作、蒲江縣網(wǎng)頁制作以及蒲江縣網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,蒲江縣網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到蒲江縣省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
PRIMARY, INDEX, UNIQUE 這3種是一類
PRIMARY 主鍵。 就是 唯一 且 不能為空。
INDEX 索引,普通的
UNIQUE 唯一索引。 不允許有重復(fù)。
FULLTEXT 是全文索引,用于在一篇文章中,檢索文本信息的。
hash 分片
理解了散列表的基本特點,再來看看分布式數(shù)據(jù)庫的 hash 分片。
hash 分片設(shè)計的要點:
1. 固定的數(shù)據(jù)映射到固定的節(jié)點 / 槽位
2. 數(shù)據(jù)分布均勻
3. 擴容方便
主要是擴容時盡可能移動較少的數(shù)據(jù)。擴容之后實現(xiàn)新的數(shù)據(jù)分布均勻。
想要實現(xiàn)動態(tài)擴容,盡可能不影響業(yè)務(wù)并保證效率,需要做到移動盡可能少的數(shù)據(jù),一致性 hash 就是為了解決移動較少數(shù)據(jù)的問題,但是一致性 hash 的缺點是數(shù)據(jù)分布的均勻性較差。為了解決這個問題,聰明的 dev 們又設(shè)計了跳增一致性 hash 算法。
到這里,可以看出 hash 與分片最緊密或者說最神似的點在于:
1. 固定的輸入有固定的輸出
2. 值呈均勻分布
如果分布式數(shù)據(jù)庫的分片數(shù)據(jù)分布不均勻,最糟情況就像散列表的極端沖突一樣,落在最終數(shù)據(jù)庫上的壓力跟不使用分布式相同。
3. 方便擴容
當(dāng)分片填充滿的時候,需要擴容使總數(shù)據(jù)量在總分片之間再次達到數(shù)據(jù)均勻分布狀態(tài),擴容需要用 hash 函數(shù)重新映射舊值到新的分片。
4. 散列表和 hash 分片想要有好的表現(xiàn)都依賴于設(shè)計良好的 hash 函數(shù)。
正是由于這些相似特點,Hash 在分布式數(shù)據(jù)庫里得到比較多的使用。回到測試的老本行,這些點便是我們測試思考的重點。
普通索引 添加INDEX
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
下面演示下給user表的name字段添加一個索引
mysql數(shù)據(jù)庫如何創(chuàng)建索引
mysql數(shù)據(jù)庫如何創(chuàng)建索引
主鍵索引 添加PRIMARY KEY
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
mysql數(shù)據(jù)庫如何創(chuàng)建索引
mysql數(shù)據(jù)庫如何創(chuàng)建索引
唯一索引 添加UNIQUE
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
mysql數(shù)據(jù)庫如何創(chuàng)建索引
全文索引 添加FULLTEXT
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
mysql數(shù)據(jù)庫如何創(chuàng)建索引
如何添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
mysql數(shù)據(jù)庫如何創(chuàng)建索引
字符串創(chuàng)建索引方式:
1、直接創(chuàng)建完整索引,比較占用空間。
2、創(chuàng)建前綴索引,節(jié)省空間,但會增加查詢掃描次數(shù),并且不能使用覆蓋索引。
3、倒序存儲,在創(chuàng)建前綴索引,用于繞過字符串本身前綴的卻分度不夠的問題。
4、創(chuàng)建hash字段索引,查詢性能穩(wěn)定,有額外的存儲和計算消耗。
倒序存儲和hash字段索引都不支持范圍查詢。倒序存儲的字段上創(chuàng)建的所有是按照倒序字符串的方式排序的。hash字段的方式也只能支持等值查詢。
mysql alter table SUser add index index1(email); :包含了每個記錄的整個字符串
或
mysql alter table SUser add index index2(email(6)); :-對于每個記錄只取前6個字節(jié)
全字段索引操作流程
使用的是 index1(即 email 整個字符串的索引結(jié)構(gòu)),執(zhí)行順序是這樣的:
1、從 index1 索引樹找到滿足索引值是’ zhangssxyz@xxx點抗 ’的這條記錄,取得 ID2 的值;
2、到主鍵上查到主鍵值是 ID2 的行,判斷 email 的值是正確的,將這行記錄加入結(jié)果集;
3、取 index1 索引樹上剛剛查到的位置的下一條記錄,發(fā)現(xiàn)已經(jīng)不滿足 email=' zhangssxyz@xxx點抗 ’的條件了,循環(huán)結(jié)束。
前綴字段索引操作流程
如果使用的是 index2(即 email(6) 索引結(jié)構(gòu)),執(zhí)行順序是這樣的:
1、從 index2 索引樹找到滿足索引值是’zhangs’的記錄,找到的第一個是 ID1;
2、到主鍵上查到主鍵值是 ID1 的行,判斷出 email 的值不是’ zhangssxyz@xxx點抗 ’,這行記錄丟棄;
3、取 index2 上剛剛查到的位置的下一條記錄,發(fā)現(xiàn)仍然是’zhangs’,取出 ID2,再到 ID 索引上取整行然后判斷,這次值對了,將這行記錄加入結(jié)果集;
4、重復(fù)上一步,直到在 idxe2 上取到的值不是’zhangs’時,循環(huán)結(jié)束。
倒序查詢和hash字段的區(qū)別
它們的區(qū)別,主要體現(xiàn)在以下三個方面:
1、從占用的額外空間來看,倒序存儲方式在主鍵索引上,不會消耗額外的存儲空間,而 hash 字段方法需要增加一個字段。當(dāng)然,倒序存儲方式使用 4 個字節(jié)的前綴長度應(yīng)該是不夠的,如果再長一點,這個消耗跟額外這個 hash 字段也差不多抵消了。
2、在 CPU 消耗方面,倒序方式每次寫和讀的時候,都需要額外調(diào)用一次 reverse 函數(shù),而 hash 字段的方式需要額外調(diào)用一次 crc32() 函數(shù)。如果只從這兩個函數(shù)的計算復(fù)雜度來看的話,reverse 函數(shù)額外消耗的 CPU 資源會更小些。
3、從查詢效率上看,使用 hash 字段方式的查詢性能相對更穩(wěn)定一些。因為 crc32 算出來的值雖然有沖突的概率,但是概率非常小,可以認為每次查詢的平均掃描行數(shù)接近 1。而倒序存儲方式畢竟還是用的前綴索引的方式,也就是說還是會增加掃描行數(shù)。