新聞中心
MySQL是一個(gè)流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),用于構(gòu)建和管理各種應(yīng)用程序。其中,全文檢索在MySQL中是非常常見的查詢操作之一,可以讓使用者能夠更好地搜索并快速找到所需的信息。但是,在本文中,我們將探討這個(gè)問題,了解MySQL全文檢索的速度,以及如何改善檢索速度。

MySQL的全文檢索功能是基于開源搜索引擎Lucene實(shí)現(xiàn)的。使用者可以在MySQL中創(chuàng)建全文索引來提高搜索速度和準(zhǔn)確性。創(chuàng)建全文索引需要花費(fèi)一定的時(shí)間和計(jì)算資源,但可以大大提高查詢速度。當(dāng)然,索引越大,查詢速度也隨之變慢,因此需要在索引大小和查詢速度之間找到一個(gè)平衡點(diǎn)。
在實(shí)際使用中,MySQL全文檢索的速度取決于多個(gè)因素。其中最重要的因素是查詢復(fù)雜度和數(shù)據(jù)量。如果查詢語句中包含太多的關(guān)鍵詞和模糊詞,那么查詢速度就會變得很慢。對于大型數(shù)據(jù)庫,即使是簡單的全文查詢,也可能需要幾十秒鐘的時(shí)間來返回結(jié)果。
為了優(yōu)化MySQL全文檢索的速度,可以考慮以下幾點(diǎn):
1. 建立適當(dāng)?shù)娜乃饕簞?chuàng)建全文索引可以加速搜索速度,但也需要權(quán)衡索引大小和查詢速度之間的關(guān)系。只需要建立必要的索引。
2. 優(yōu)化數(shù)據(jù)庫查詢語句:避免使用過于復(fù)雜或冗長的查詢語句,盡量使用簡單直接的語句來進(jìn)行查詢。
3. 使用限制條件:使用限制條件(例如時(shí)間范圍、排序、分頁等)可以減少查詢數(shù)據(jù)量,提高查詢速度。
4. 使用緩存機(jī)制:如Memcached和Redis等緩存機(jī)制可以大大提高查詢速度。
5. 使用分詞引擎:如果你的查詢數(shù)據(jù)中包含漢字,那么可以考慮使用中文分詞引擎來提高檢索速度。
MySQL數(shù)據(jù)庫全文檢索的速度是有可能很慢的。但是通過建立適當(dāng)?shù)乃饕?、?yōu)化查詢語句、使用限制條件、使用緩存機(jī)制和分詞引擎等方法,可以優(yōu)化全文檢索的速度,提高查詢效率。在實(shí)際使用中,建議綜合考慮不同的因素,來平衡索引大小和查詢速度之間的關(guān)系,以獲得更佳的查詢結(jié)果。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220如何寫索引,讓查詢速度快
首先來看看表是否有索引的命令
show index from 表名;
看到主鍵索引,索引類型是REE(二叉樹)
正是因?yàn)檫@個(gè)二叉樹算法,讓查詢速度快很多,二叉樹的原理,就是取最中間的一個(gè)數(shù),然后把大于這個(gè)數(shù)的往右邊排,小于這個(gè)數(shù)的就向左排,每次減半,然后依次類推,每次減半,形成一個(gè)樹狀結(jié)構(gòu)圖
例如上面的例子,我們不使用索引的話,需要查詢11次才把編號為4的數(shù)據(jù)取出,如果加上索引,我們只需要4次就可以取出。
如大家所知道的,MySQL目前主要有以下幾種索引類型:FULLTEXT,HASH,REE,RTREE。
那么,這幾種索引有什么功能和性能上的不同呢?
FULLTEXT
即為全文索引,目前只有MyISAM引擎支持。其正則可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以創(chuàng)建全文索引。值得一提的是,在數(shù)據(jù)量較大時(shí)候,現(xiàn)將數(shù)據(jù)放入一個(gè)沒有全局索引的表中,然后再用CREATE INDEX創(chuàng)建脊清沖FULLTEXT索引,要比先為一張表建立FULLTEXT然后再將數(shù)據(jù)寫入的速度快很多。
全文索引并不是和MyISAM一起誕生的,它的出現(xiàn)是為了解決WHERE name LIKE “%word%”這類針對文本的模糊查詢效率較低的問題。在沒有全文索引之前,這樣一個(gè)查詢語句是要進(jìn)行遍歷數(shù)據(jù)表操作的,可見,在數(shù)據(jù)量較大時(shí)是極其的耗時(shí)的,如果沒有異步IO處理,進(jìn)程將被挾持,很浪費(fèi)時(shí)間,當(dāng)然這里不對異步IO作進(jìn)一步講解,想了解的童鞋,自行谷哥。
全文索引的使用方法并不復(fù)雜:
創(chuàng)建ALTER TABLE table ADD INDEX `FULLINDEX` USING FULLTEXT(`cname1`);
使用SELECT * FROM table WHERE MATCH(cname1) AGAINST (‘word’ MODE );
其中, MODE為搜尋方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。
關(guān)于這三種搜尋方式,愚安在這里也不多做交代,簡單地說,就是,布爾模式,允許word里含一些特殊字符用于標(biāo)記一些具體的要求,如+表示一定要有,-表示一定沒有,*表示通用匹配符,是不是想起了正則,類似吧;自然語言模式,就是簡單的單詞匹配;含表達(dá)式的自然語言模式,就是先用自然語言模式處理,對返回的結(jié)果,再進(jìn)行表達(dá)式匹櫻殲配。
對搜索引擎稍微有點(diǎn)了解的同學(xué),肯定知道分詞這個(gè)概念,F(xiàn)ULLTEXT索引也是按照分詞原理建立索引的。西文中,大部分為字母文字,分詞可以很方便的按照空格進(jìn)行分割。但很明顯,中文不能按照這種方式進(jìn)行分詞。那又怎么辦呢?這個(gè)向大家介紹一個(gè)Mysql的中文分詞插件Mysqlcft,有了它,就可以對中文進(jìn)行分詞,想了解的同學(xué)請移步Mysqlcft,當(dāng)然還有其他的分詞插件可以使用。
HASH
Hash這個(gè)詞,可以說,自打我們開始碼的那一天起,就開始不停地見到和使用到了。其實(shí),hash就是一種(key=>value)形式的鍵值對,如數(shù)學(xué)中的函數(shù)映射,允許多個(gè)key對應(yīng)相同的value,但不允許一個(gè)key對應(yīng)多個(gè)value。正是由于這個(gè)特性,hash很適合做索引,為某一列或幾列建立hash索引,就會利用這一列或幾列的值通過一定的算法計(jì)算出一個(gè)hash值,對應(yīng)一行或幾行數(shù)據(jù)(這里在概念上和函數(shù)映射有區(qū)別,不要混淆)。在Java語言中,每個(gè)類都有自己的hashcode()方法,沒有顯示定義的都繼承自object類,該方法使得每一個(gè)對象都是唯一的,在進(jìn)行對象間equal比較,和序列化傳輸中起到了很重要的作用。hash的生成方法有很多種,足可以保證hash碼的唯一性,例如在MongoDB中,每一個(gè)document都有系統(tǒng)為其生成的唯一的objectID(包含時(shí)間戳,主機(jī)散列值,進(jìn)程PID,和自增ID)也是一種hash的表現(xiàn)。額,我好像扯遠(yuǎn)了-_-!
由于hash索引可以一次定位,不需要像樹形索引那樣逐層查找,因此具有極高的效率。那為什么還需要其他的樹形索引呢?
在這里愚安就不自己總結(jié)了。引用下園子里其他大神的文章:來自 14的路 的MySQL的btree索引和hash索引的區(qū)別
(1)Hash 索引僅僅能滿足”=”,”IN”和””查詢,不能使用范圍查詢。
由于 Hash 索引比較的是進(jìn)行 Hash 運(yùn)算之后的 Hash 值,所以它只能用于等值的過濾,不能用于基于范圍的過濾,因?yàn)榻?jīng)過相應(yīng)的 Hash 算法處理之后的 Hash 值的大小關(guān)系,并不能保證和Hash運(yùn)算前完全一樣。
(2)Hash 索引無法被用來避免數(shù)據(jù)的排序操作。
由于 Hash 索引中存放的是經(jīng)過 Hash 計(jì)算之后的 Hash 值,而且Hash值的大小關(guān)系并不一定和 Hash 運(yùn)算前的鍵值完全一樣,所以數(shù)據(jù)庫無法利用索引的數(shù)據(jù)來避免任何排序運(yùn)算;
(3)Hash 索引不能利用部分索引鍵查詢。
對于組合索引,Hash 索引在計(jì)算 Hash 值的時(shí)候是組合索引鍵合并后再一起計(jì)算 Hash 值,而不是單獨(dú)計(jì)算 Hash 值,所以通過組合索引的前面一個(gè)或幾個(gè)索引鍵進(jìn)行查詢的時(shí)候,Hash 索引也無法被利用。
(4)Hash 索引在任何時(shí)候都不能避免表掃描。
前面已經(jīng)知道,Hash 索引是將索引鍵通過 Hash 運(yùn)算之后,將 Hash運(yùn)算結(jié)果的 Hash 值和所對應(yīng)的行指針信息存放于一個(gè) Hash 表中,由于不同索引鍵存在相同 Hash 值,所以即使取滿足某個(gè) Hash 鍵值的數(shù)據(jù)的記錄條數(shù),也無法從 Hash 索引中直接完成查詢,還是要通過訪問表中的實(shí)際數(shù)據(jù)進(jìn)行相應(yīng)的比較,并得到相應(yīng)的結(jié)果。
(5)Hash 索引遇到大量Hash值相等的情況后性能并不一定就會比B-Tree索引高。
對于選擇性比較低的索引鍵,如果創(chuàng)建 Hash 索引,那么將會存在大量記錄指針信息存于同一個(gè) Hash 值相關(guān)聯(lián)。這樣要定位某一條記錄時(shí)就會非常麻煩,會浪費(fèi)多次表數(shù)據(jù)的訪問,而造成整體性能低下。
愚安我稍作補(bǔ)充,講一下HASH索引的過程,順便解釋下上面的第4,5條:
當(dāng)我們?yōu)槟骋涣谢蚰硯琢薪ash索引時(shí)(目前就只有MEMORY引擎顯式地支持這種索引),會在硬盤上生成類似如下的文件:
hash值 存儲地址
1db54bc745a#45b5
4bca452157d#4556,77#45cc…
…
hash值即為通過特定算法由指定列數(shù)據(jù)計(jì)算出來,磁盤地址即為所在數(shù)據(jù)行存儲在硬盤上的地址(也有可能是其他存儲地址,其實(shí)MEMORY會將hash表導(dǎo)入內(nèi)存)。
這樣,當(dāng)我們進(jìn)行WHERE age = 18 時(shí),會將18通過相同的算法計(jì)算出一個(gè)hash值==>在hash表中找到對應(yīng)的儲存地址==>根據(jù)存儲地址取得數(shù)據(jù)。
所以,每次查詢時(shí)都要遍歷hash表,直到找到對應(yīng)的hash值,如(4),數(shù)據(jù)量大了之后,hash表也會變得龐大起來,性能下降,遍歷耗時(shí)增加,如(5)。
REE
REE索引就是一種將索引值按一定的算法,存入一個(gè)樹形的數(shù)據(jù)結(jié)構(gòu)中,相信學(xué)過數(shù)據(jù)結(jié)構(gòu)的童鞋都對當(dāng)初學(xué)習(xí)二叉樹這種數(shù)據(jù)結(jié)構(gòu)的經(jīng)歷記憶猶新,反正愚安我當(dāng)時(shí)為了軟考可是被這玩意兒好好地折騰了一番,不過那次考試好像沒怎么考這個(gè)。如二叉樹一樣,每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。
REE在MyISAM里的形式和Innodb稍有不同
在 Innodb里,有兩種形態(tài):一是primary key形態(tài),其leaf node里存放的是數(shù)據(jù),而且不僅存放了索引鍵的數(shù)據(jù),還存放了其他字段的數(shù)據(jù)。二是secondary index,其leaf node和普通的REE差不多,只是還存放了指向主鍵的信息.
而在MyISAM里,主鍵和其他的并沒有太大區(qū)別。不過和Innodb不太一樣的地方是在MyISAM里,leaf node里存放的不是主鍵的信息,而是指向數(shù)據(jù)文件里的對應(yīng)數(shù)據(jù)行的信息.
RTREE
RTREE在mysql很少使用,僅支持geometry數(shù)據(jù)類型,支持該類型的存儲引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。
相對于REE,RTREE的優(yōu)勢在于范圍查找.
各種索引的使用情況
(1)對于REE這種Mysql默認(rèn)的索引類型,具有普遍的適用性
(2)由于FULLTEXT對中文支持不是很好,在沒有插件的情況下,更好不要使用。其實(shí),一些小的博客應(yīng)用,只需要在數(shù)據(jù)采集時(shí),為其建立關(guān)鍵字列表,通過關(guān)鍵字索引,也是一個(gè)不錯(cuò)的方法,至少愚安我是經(jīng)常這么做的。
(3)對于一些搜索引擎級別的應(yīng)用來說,F(xiàn)ULLTEXT同樣不是一個(gè)好的處理方法,Mysql的全文索引建立的文件還是比較大的,而且效率不是很高,即便是使用了中文分詞插件,對中文分詞支持也只是一般。真要碰到這種問題,Apache的Lucene或許是你的選擇。
mysql數(shù)據(jù)庫全文檢索速度的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于mysql數(shù)據(jù)庫全文檢索速度,MySQL數(shù)據(jù)庫全文檢索的速度如何?,如何寫索引,讓查詢速度快的信息別忘了在本站進(jìn)行查找喔。
成都網(wǎng)站建設(shè)選創(chuàng)新互聯(lián)(?:028-86922220),專業(yè)從事成都網(wǎng)站制作設(shè)計(jì),高端小程序APP定制開發(fā),成都網(wǎng)絡(luò)營銷推廣等一站式服務(wù)。
名稱欄目:MySQL數(shù)據(jù)庫全文檢索的速度如何?(mysql數(shù)據(jù)庫全文檢索速度)
分享地址:http://fisionsoft.com.cn/article/cdcshoo.html


咨詢
建站咨詢
