1、?索引
1.1 、索引的定義及優(yōu)缺點(diǎn)
索引的定義:索引是對(duì)數(shù)據(jù)庫表的一列或者多列的值進(jìn)行排序一種結(jié)構(gòu),使用索引可以快速訪問數(shù)據(jù)表中的特定信息。
通俗來講,索引就是數(shù)據(jù)庫表的一個(gè)目錄,通過索引,我們可以迅速的找到數(shù)據(jù)庫中的數(shù)據(jù),并進(jìn)行相應(yīng)的增刪改查等操作。
索引的使用大大加快數(shù)據(jù)檢索的速度,將隨機(jī)I/O變成順序I/O(因?yàn)锽+樹的葉子節(jié)點(diǎn)是連接在一起的),加速表與表之間的連接,使得我們查詢數(shù)據(jù)更為方便,因此我們?cè)趫?zhí)行數(shù)據(jù)庫查詢時(shí),基本離不開索引,但與此同時(shí),他也有一定缺點(diǎn),從空間角度考慮,建立索引需要占用物理空間,其會(huì)占用計(jì)算機(jī)的內(nèi)存,因而我們?cè)跀?shù)據(jù)庫優(yōu)化時(shí)會(huì)盡量減少索引的建立;從時(shí)間角度考慮,創(chuàng)建和維護(hù)索引都需要花費(fèi)時(shí)間,例如對(duì)數(shù)據(jù)進(jìn)行增刪改的時(shí)候都需要維護(hù)索引,因此在創(chuàng)建索引時(shí),我們應(yīng)當(dāng)要注意不能創(chuàng)建太多索引。
1.2 索引的數(shù)據(jù)結(jié)構(gòu)
索引的數(shù)據(jù)結(jié)構(gòu)主要有B+樹和哈希表,對(duì)應(yīng)的索引分別為B+樹索引和哈希索引。InnoDB引擎的索引類型有B+樹索引和哈希索引,默認(rèn)的索引類型為B+樹索引。一般來說,我們?cè)诓樵儠r(shí)更多的是用B+數(shù),其原因是其查找的效率非常高,并且支持排序和范圍查找;哈希索引一般多用于精確的等值查找。
MySQL主要的索引類型主要有FULLTEXT,HASH,BTREE,RTREE。
FULLTEXT:FULLTEXT即全文索引,MyISAM存儲(chǔ)引擎和InnoDB存儲(chǔ)引擎在MySQL5.6.4以上版本支持全文索引,一般用于查找文本中的關(guān)鍵字,而不是直接比較是否相等,多在CHAR,VARCHAR,TAXT等數(shù)據(jù)類型上創(chuàng)建全文索引。全文索引主要是用來解決WHERE name LIKE "%zhang%"等針對(duì)文本的模糊查詢效率低的問題。
HASH:HASH即哈希索引,哈希索引多用于等值查詢,時(shí)間復(fù)雜夫?yàn)閛(1),效率非常高,但不支持排序、范圍查詢及模糊查詢等。
BTREE:BTREE即B+樹索引,INnoDB存儲(chǔ)引擎默認(rèn)的索引,支持排序、分組、范圍查詢、模糊查詢等,并且性能穩(wěn)定。
RTREE:RTREE即空間數(shù)據(jù)索引,多用于地理數(shù)據(jù)的存儲(chǔ),相比于其他索引,空間數(shù)據(jù)索引的優(yōu)勢(shì)在于范圍查找
1.1.3、索引的分類
? ? ? ?1、唯一索引: 是在表上一個(gè)或者多個(gè)字段組合建立的索引,這個(gè)或者這些字段的值組合起來在表中不可以重復(fù)。
??2、非唯一索引: 是在表上一個(gè)或者多個(gè)字段組合建立的索引,這個(gè)或者這些字段的值組合起來在表中可以重復(fù),不要求唯一。
??3、主鍵索引(主索引): 是唯一索引的特定類型。表中創(chuàng)建主鍵時(shí)自動(dòng)創(chuàng)建的索引,一個(gè)表只能建立一個(gè)主索引。
??4、聚集索引(聚簇索引、Innodb):表中記錄的物理順序與鍵值的索引順序相同。 因?yàn)檎鎸?shí)數(shù)據(jù)的物理順序只有一種,所以一個(gè)表只能有一個(gè)聚集索引。葉子節(jié)點(diǎn)(B+樹)存儲(chǔ)真實(shí)的數(shù)據(jù)行,不再有另外單獨(dú)的數(shù)據(jù)頁。
??5、非聚集索引(Mylsam):表中記錄的物理順序與鍵值的索引順序不同。這也是非聚集索引與聚集索引的根本區(qū)別。葉子節(jié)點(diǎn)并非數(shù)據(jù)節(jié)點(diǎn),而是每一個(gè)指向真正數(shù)據(jù)行的指針。
??
聚簇索引和非聚簇索引最主要的區(qū)別是數(shù)據(jù)和索引是否分開存儲(chǔ)。
- 聚簇索引:將數(shù)據(jù)和索引放到一起存儲(chǔ),索引結(jié)構(gòu)的葉子節(jié)點(diǎn)保留了數(shù)據(jù)行。
- 非聚簇索引:將數(shù)據(jù)進(jìn)和索引分開存儲(chǔ),索引葉子節(jié)點(diǎn)存儲(chǔ)的是指向數(shù)據(jù)行的地址。
2 數(shù)據(jù)庫引擎
2.1 數(shù)據(jù)庫引擎的定義及理解
數(shù)據(jù)庫引擎簡(jiǎn)單來說就是一個(gè)"數(shù)據(jù)庫發(fā)動(dòng)機(jī)"。當(dāng)你訪問數(shù)據(jù)庫時(shí),不管是手工訪問,還是程序訪問,都不是直接讀寫數(shù)據(jù)庫文件,而是 通過數(shù)據(jù)庫引擎去訪問數(shù)據(jù)庫文件。以關(guān)系型數(shù)據(jù)庫為例,你發(fā)SQL語句給數(shù)據(jù)庫引擎, 數(shù)據(jù)庫引擎解釋SQL語句,提取出你需要的數(shù)據(jù)返回給你。因此,對(duì)訪問者來說,數(shù)據(jù)庫引擎就是SQL語句的解釋器。正式來說,數(shù)據(jù)庫引擎是用于存儲(chǔ)、處理和保護(hù)數(shù)據(jù)的核心服務(wù)。利用數(shù)據(jù)庫引擎可以 控制訪問權(quán)限并快速處理事務(wù),從而滿足企業(yè)內(nèi)大多數(shù)需要 處理大量數(shù)據(jù)的應(yīng)用程序的要求,這包括 創(chuàng)建用于存儲(chǔ)數(shù)據(jù)的表和用于查看、管理和保護(hù)數(shù)據(jù)安全的數(shù)據(jù)庫對(duì)象(如索引、視圖和存儲(chǔ)過程)
?參見blog:(176條消息) 數(shù)據(jù)庫引擎學(xué)習(xí)總結(jié)_gentelyang的博客-CSDN博客_數(shù)據(jù)庫引擎
2.2、數(shù)據(jù)庫引擎的任務(wù)
1:設(shè)計(jì)并創(chuàng)建數(shù)據(jù)庫以保存系統(tǒng)所需要的關(guān)系或xml文檔
2:實(shí)現(xiàn)系統(tǒng)以訪問或更改數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù),實(shí)現(xiàn)網(wǎng)站或使用數(shù)據(jù)的應(yīng)用程序,包括使用SOL Server工具和使用工具已使用數(shù)據(jù)的過程。
3:為單位或用戶部署實(shí)現(xiàn)的系統(tǒng)
4:提供日常管理支持優(yōu)化數(shù)據(jù)庫的性能。
2.3、引擎的類別
常見的數(shù)據(jù)庫引擎類別包括ISAM、MYISAM,HEAP和INNODB,其是mysql數(shù)據(jù)庫的有機(jī)組成部分,在數(shù)據(jù)查詢中起到了非常重要的作用。其詳細(xì)介紹如下:
ISAM
ISAM是一個(gè)定義明確且歷經(jīng)時(shí)間考驗(yàn)的數(shù)據(jù)表格管理方法,它在設(shè)計(jì)之時(shí)就考慮到數(shù)據(jù)庫被查詢的次數(shù)要遠(yuǎn)大于更新的次數(shù)。因此,ISAM執(zhí)行讀取操作的速度很快,而且不占用大量的內(nèi)存和存儲(chǔ)資源。ISAM的兩個(gè)主要不足之處在于,它不支持事務(wù)處理,也不能夠容錯(cuò):如果你的硬盤崩潰了,那么數(shù)據(jù)文件就無法恢復(fù)了。如果你正在把ISAM用在關(guān)鍵任務(wù)應(yīng)用程序里,那就必須經(jīng)常備份你所有的實(shí)時(shí)數(shù)據(jù),通過其復(fù)制特性,MySQL能夠支持這樣的備份應(yīng)用程序。
MyISAM
MyISAM是MySQL的ISAM擴(kuò)展格式和缺省的數(shù)據(jù)庫引擎。除了提供ISAM里所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機(jī)制,來優(yōu)化多個(gè)并發(fā)的讀寫操作。其代價(jià)是你需要經(jīng)常運(yùn)行OPTIMIZE?TABLE命令,來恢復(fù)被更新機(jī)制所浪費(fèi)的空間。MyISAM還有一些有用的擴(kuò)展,例如用來修復(fù)數(shù)據(jù)庫文件的MyISAMChk工具和用來恢復(fù)浪費(fèi)空間的MyISAMPack工具。
HEAP
HEAP允許只駐留在內(nèi)存里的臨時(shí)表格。駐留在內(nèi)存里讓HEAP要比ISAM和MyISAM都快,但是它所管理的數(shù)據(jù)是不穩(wěn)定的,而且如果在關(guān)機(jī)之前沒有進(jìn)行保存,那么所有的數(shù)據(jù)都會(huì)丟失。在數(shù)據(jù)行被刪除的時(shí)候,HEAP也不會(huì)浪費(fèi)大量的空間。HEAP表格在你需要使用SELECT表達(dá)式來選擇和操控?cái)?shù)據(jù)的時(shí)候非常有用。要記住,在用完表格之后就刪除表格。讓我再重復(fù)一遍:在你用完表格之后,不要忘記刪除表格。
InnoDB和Berkley?DB
InnoDB和Berkley?DB(BDB)數(shù)據(jù)庫引擎都是造就MySQL靈活性的技術(shù)的直接產(chǎn)品,這項(xiàng)技術(shù)就是MySQL++?API。在使用MySQL的時(shí)候,你所面對(duì)的每一個(gè)挑戰(zhàn)幾乎都源于ISAM和MyISAM數(shù)據(jù)庫引擎不支持事務(wù)處理也不支持外來鍵。盡管要比ISAM和MyISAM引擎慢很多,但是InnoDB和BDB包括了對(duì)事務(wù)處理和外來鍵的支持,這兩點(diǎn)都是前兩個(gè)引擎所沒有的。如前所述,如果你的設(shè)計(jì)需要這些特性中的一者或者兩者,那你就要被迫使用后兩個(gè)引擎中的一個(gè)了。
2.4、InnoDB引擎和MyISAM引擎的區(qū)別
在InnoDB存儲(chǔ)引擎中,默認(rèn)的索引為B+樹索引,利用主鍵創(chuàng)建的索引為主索引,也是聚簇索引,在主索引之上創(chuàng)建的索引為輔助索引,也是非聚簇索引。為什么說輔助索引是在主索引之上創(chuàng)建的呢,因?yàn)檩o助索引中的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵。
在MyISAM存儲(chǔ)引擎中,默認(rèn)的索引也是B+樹索引,但主索引和輔助索引都是非聚簇索引,也就是說索引結(jié)構(gòu)的葉子節(jié)點(diǎn)存儲(chǔ)的都是一個(gè)指向數(shù)據(jù)行的地址。并且使用輔助索引檢索無需訪問主鍵的索引。
3 數(shù)據(jù)庫事務(wù)
3.1、事務(wù)的四大特性
原子性:事務(wù)是最小的執(zhí)行單位,要么全部執(zhí)行,要么全部不執(zhí)行
一致性:執(zhí)行事務(wù)前后,數(shù)據(jù)保持一致,多個(gè)事務(wù)讀取的結(jié)果是相同的
隔離性:并發(fā)訪問數(shù)據(jù)時(shí),一個(gè)用戶事務(wù)不會(huì)被其他事務(wù)所干擾
持久性:事務(wù)完成以后,該事務(wù)所對(duì)數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中,并不會(huì)被回滾。
3.2 事務(wù)的隔離級(jí)別
事務(wù)的隔離級(jí)別共有四種,包括讀未提交、讀以提交、可重復(fù)讀、可序列化,由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個(gè)級(jí)別可以逐個(gè)解決臟讀、不可重復(fù)讀、幻讀這幾類問題。
Read uncommitted 讀未提交:事務(wù)B讀取了事務(wù)A尚未提交的數(shù)據(jù),可能出現(xiàn)臟讀
Read committed 讀提交:事務(wù)A事先讀取了數(shù)據(jù),事務(wù)B緊接了更新了數(shù)據(jù),并提交了事務(wù),而事務(wù)A再次讀取該數(shù)據(jù)時(shí),數(shù)據(jù)已經(jīng)發(fā)生了改變,避免了臟讀,但是可能會(huì)造成不可重復(fù)讀
Repeatable read 重復(fù)讀: ,避免了不可重復(fù)讀,但還有可能出現(xiàn)幻讀。注:MySQL的默認(rèn)隔離級(jí)別就是Repeatable read。
Serializable 序列化:Serializable是最高的事務(wù)隔離級(jí)別,同時(shí)代價(jià)也花費(fèi)最高,性能很低,一般很少使用,在該級(jí)別下,事務(wù)順序執(zhí)行,不僅可以避免臟讀、不可重復(fù)讀,還避免了幻像讀。
1.3.3、重復(fù)讀與幻讀
重復(fù)讀是為了保證在一個(gè)事務(wù)中,相同查詢條件下讀取的數(shù)據(jù)值不發(fā)生改變,但是不能保證下次同樣條件查詢,結(jié)果記錄數(shù)不會(huì)增加。
幻讀就是為了解決這個(gè)問題而存在的,他將這個(gè)查詢范圍都加鎖了,所以就不能再往這個(gè)范圍內(nèi)插入數(shù)據(jù),這就是SERIALIZABLE 隔離級(jí)別做的事情。
4 、索引,引擎和事務(wù)的聯(lián)系
4.1 三者的關(guān)系
通俗來說,索引是數(shù)據(jù)庫查詢,編寫數(shù)據(jù)的一個(gè)目錄,引擎可以說是數(shù)據(jù)庫與外界交互的一個(gè)工具,而事務(wù)則是決定數(shù)據(jù)庫與外界業(yè)務(wù)交付的最小單位。通過對(duì)于數(shù)據(jù)庫索引,引擎以及事務(wù)的認(rèn)識(shí),我們才能更清楚了解和掌握數(shù)據(jù)庫是如何使用的。也可以通過此來了解和掌握mysql以及和mysqls數(shù)據(jù)庫相關(guān)的事務(wù),也能更清楚如何對(duì)sql語句進(jìn)行優(yōu)化以及優(yōu)化數(shù)據(jù)庫表。
4.2.mysql中的數(shù)據(jù)庫索引以及引擎
MySQL主要的索引類型主要有FULLTEXT,HASH,BTREE,RTREE。分別是全文索引,哈希索引,B+樹索引,以及即空間數(shù)據(jù)索引,他們共同構(gòu)成了數(shù)據(jù)庫的INnoDB,MYISAM以及HEAP等基本存儲(chǔ)引擎和查找引擎,也使得數(shù)據(jù)庫有眾多功能,可以支持排序、分組、范圍查詢、模糊查詢等操作,使得數(shù)據(jù)可以發(fā)揮其生產(chǎn)力。
而其與外界交互的sql語句則共同組成了一個(gè)個(gè)事務(wù),使得數(shù)據(jù)的操作成為一個(gè)個(gè)完整的事件,從而能夠通過組合來反映我們世界的變化,從而助力與我們生活中的方方面面,發(fā)揮其獨(dú)特的功能。比如通過mysql中表格數(shù)據(jù)的不同查詢條件,我們可以得出和篩選出不同人的得分情況,從而
4.3 其他數(shù)據(jù)庫的設(shè)計(jì)以及思考
4.3 .1 Oracle數(shù)據(jù)庫的引擎
oracle中不存在引擎的概念,數(shù)據(jù)處理大致可以分成兩大類:聯(lián)機(jī)事務(wù)處理OLTP(on-line transaction processing)、聯(lián)機(jī)分析處理OLAP(On-Line Analytical Processing)。OLTP是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的主要應(yīng)用,主要是基本的、日常的事務(wù)處理,例如銀行交易。OLAP是數(shù)據(jù)倉庫系統(tǒng)的主要應(yīng)用,支持復(fù)雜的分析操作,側(cè)重決策支持,并且提供直觀易懂的查詢結(jié)果。
OLTP和OLAP的區(qū)別
OLTP?系統(tǒng)強(qiáng)調(diào)數(shù)據(jù)庫內(nèi)存效率,強(qiáng)調(diào)內(nèi)存各種指標(biāo)的命令率,強(qiáng)調(diào)綁定變量,強(qiáng)調(diào)并發(fā)操作;
OLAP?系統(tǒng)則強(qiáng)調(diào)數(shù)據(jù)分析,強(qiáng)調(diào)SQL執(zhí)行市場(chǎng),強(qiáng)調(diào)磁盤I/O,強(qiáng)調(diào)分區(qū)等。?
?
參見blog:https://blog.csdn.net/cafucwxy/article/details/78319414
4.3.2 Sqlite數(shù)據(jù)庫設(shè)計(jì)
sqlite數(shù)據(jù)庫設(shè)計(jì)是以零配置而生效的,具有可兼得性,
4.3.3 redis數(shù)據(jù)庫
4.3.4 mongoDB
4.3.5 hBase數(shù)據(jù)庫
5.數(shù)據(jù)庫優(yōu)化策略
1、索引優(yōu)化
2、分庫分表
3、其他文章來源:http://www.zghlxwxcb.cn/news/detail-437660.html
參考資料:https://blog.csdn.net/lydon1314/article/details/121479989文章來源地址http://www.zghlxwxcb.cn/news/detail-437660.html
到了這里,關(guān)于數(shù)據(jù)庫搜索引擎介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!