当前位置:首页 > TAG信息列表 > mysql全文索引实现原理mysqlinnodb建立普通索引怎么写?

mysql全文索引实现原理mysqlinnodb建立普通索引怎么写?

mysql全文索引实现原理 mysql innodb建立普通索引怎么写?

mysqlinnodb建立普通索引怎么写?

先从数据结构的角度来答。

题主应该知道b-树和b树最重要的一个区别就是b树只有叶节点存放数据,其余节点用来索引,而b-树是每个索引节点都会有data域。

这就决定了b树更适合用来存储外部数据,也就是所谓的磁盘数据。

mysql全文索引实现原理 mysql innodb建立普通索引怎么写?

从mysql(inoodb)的角度来看,b树是用来充当索引的,一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上。

那么mysql如何衡量查询效率呢?磁盘io次数,b-树(b类树)的特定就是每层节点数目非常多,层数很少,目的就是为了就少磁盘io次数,当查询数据的时候,最好的情况就是很快找到目标索引,然后读取数据,使用b树就能很好的完成这个目的,但是b-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘io次数(磁盘io一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,io次数增多,一次io多耗时啊!),而b树除了叶子节点其它节点并不存储数据,节点小,磁盘io次数就少。这是优点之一。

另一个优点是什么,b树所有的data域在叶子节点,一般来说都会进行一个优化,就是将所有的叶子节点用指针串起来。这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。

至于mongodb为什么使用b-树而不是b树,可以从它的设计角度来考虑,它并不是传统的关系性数据库,而是以json格式作为存储的nosql,目的就是高性能,高可用,易扩展。首先它摆脱了关系模型,上面所述的优点2需求就没那么强烈了,其次mysql由于使用b树,数据都在叶节点上,每次查询都需要访问到叶节点,而mongodb使用b-树,所有节点都有data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于mysql(但侧面来看mysql至少平均查询耗时差不多)。

总体来说,mysql选用b树和mongodb选用b-树还是以自己的需求来选择的。

mysql全文索引应用简明教程?

全文检索在mysql里面很早就支持了,只不过一直以来只支持英文。缘由是他从来都使用空格来作为分词的分隔符,而对于中文来讲,显然用空格就不合适,需要针对中文语义进行分词。

这不,从mysql5.7开始,mysql内置了ngram全文检索插件,用来支持中文分词,并且对myisam和innodb引擎有效。

在使用中文检索分词插件ngram之前,先得在mysql配置文件里面设置他的分词大小,比如,[mysqld]ngram_token_size2这里把分词大小设置为2。要记住,分词的size越大,索引的体积就越大,所以要根据自身情况来设置合适的大小。

示例表结构:

createtablearticles(idintunsignedauto_incrementnotnullprimarykey,titlevarchar(200),bodytext,fulltext(title,body)withparserngram)engineinnodbcharactersetutf8mb4示例数据,有6行记录。mysqlgtselect*fromarticlesg**************************

*1.row***************************id:1title:数据库管理body:在本教程中我将向你展示如何管理数据库***************************2.row***************************id:2title:数据库应用开发body:学习开发数据库应用程序***************************3.row***************************id:3title:mysql完全手册body:学习mysql的一切***************************4.row***************************id:4title:数据库与事务处理body:系统的学习数据库的事务概论***************************5.row***************************id:5title:nosql精髓body:学习了解各种非结构化数据库***************************6.row***************************id:6title:sql语言详解body:详细了解如果使用各种sql6rowsinset(0.00sec)显式指定全文检索表源mysqlgtsetglobalinnodb_ft_aux_table#34new_feature/articles#34queryok,0rowsaffected(0.00sec)通过系统表,就可以查看到底是怎么划分articles里的数据。

mysqlgtselect*frominformation__ft_index_cachelimit20,10--------------------------------------------------------------|word|first_doc_id|last_doc_id|doc_count|doc_id|position|--------------------------------------------------------------|中我|2|2|1|2|28||习m|4|4|1|4|21||习了|6|6|1|6|16||习开|3|3|1|3|25||习数|5|5|1|5|37||了解|6|7|2|6|19||了解|6|7|2|7|23||事务|5|5|1|5|12||事务|5|5|1|5|40||何管|2|2|1|2|52|--------------------------------------------------------------10rowsinset(0.00sec)这里可以看到,把分词长度设置为2,所有的数据都只有两个一组。上面数据还包含了行的位置,id等等信息。

接下来,我来进行一系列检索示范,使用方法和原来英文检索一致。1.自然语言模式下检索:

a,得到符合条件的个数,mysqlgtselectcount(*)fromarticles-gtwherematch(title,body)against(#39数据库#39innaturallanguagemode)----------|count(*)|----------|4|----------1rowinset(0.05sec)b,得到匹配的比率,mysqlgtselectid,match(title,body)against(#39数据库#39innaturallanguagemode)asscorefromarticles--------------------------|id|score|--------------------------|1|0.12403252720832825||2|0.12403252720832825||3|0||4|0.12403252720832825||5|0.062016263604164124||6|0|--------------------------6rowsinset(0.00sec)2.布尔模式下搜索,这个就相对于自然模式搜索来的复杂些:a,匹配既有管理又有数据库的记录,mysqlgtselect*fromarticleswherematch(title,body)-gtagainst(#39数据库管理#39inbooleanmode)------------------------------------------------------|id|title|body|------------------------------------------------------|1|数据库管理|在本教程中我将向你展示如何管理数据库|------------------------------------------------------1rowinset(0.00sec)b,匹配有数据库,但是没有管理的记录,mysqlgtselect*fromarticleswherematch(title,body)-gtagainst(#39数据库-管理#39inbooleanmode)--------------------------------------------------|id|title|body|--------------------------------------------------|2|数据库应用开发|学习开发数据库应用程序||4|数据库与事务处理|系统的学习数据库的事务概论||5|nosql精髓|学习了解各种非结构化数据库|--------------------------------------------------3rowsinset(0.00sec)c,匹配mysql,但是把数据库的相关性降低,mysqlgtselect*fromarticleswherematch(title,body)-gtagainst(#39gt数据库mysql#39inbooleanmode)------------------------------------|id|title|body|------------------------------------|3|mysql完全手册|学习mysql的一切|------------------------------------1rowinset(0.00sec)3,查询扩展模式,比如要搜索数据库,那么mysql,oracle,db2也都将会被搜索到,mysqlgtselect*fromarticles-gtwherematch(title,body)-gtagainst(#39数据库#39withqueryexpansion)------------------------------------------------------------|id|title|body|------------------------------------------------------------|1|数据库管理|在本教程中我将向你展示如何管理数据库|4|数据库与事务处理|系统的学习数据库的事务概论|2|数据库应用开发|学习开发数据库应用程序||5|nosql精髓|学习了解各种非结构化数据库||6|sql语言详解|详细了解如果使用各种sql||3|mysql完全手册|学习mysql的一切|------------------------------------------------------------6rowsinset(0.01sec)当然,我这里只是功能演示,更多的性能测试,大家有兴趣可以进行详细测试。由于n-grm是中文检索常用的分词算法,已经在互联网大量使用,这次集成到mysql中,想必效果上不会有太大的问题。

数据库数据mysql分词


陕西自考之家 websoft网络软件专家

  • 关注微信关注微信

猜你喜欢

热门标签

老年手机显示飞行模式 vivo手机上的互传功能是哪个图标介绍 荣耀v10升级鸿蒙系统类型怎么填写荣耀V10鸿蒙系统升级方法 华为端口安全 定时删除的说说怎么发 excel表格中如何筛选出自己想要的内容 oppo手机屏幕失灵无法点击怎么办 iphone更换siri识别 微信语音来电怎么没声音 苹果手机怎么到主界面 石英晶体元器件上市公司 头条极速版订单退货怎么操作介绍 pdf格式怎么编辑修改内容 酒店房间wifi密码一般在哪里 ps现代时尚风logo制作方法ps如何logo加粗?介绍 iphone11什么情况下触控无反应苹果11平放触摸不管用?介绍 键盘打字怎么显示拼音 三星手机自动息屏时间怎么取消三星fold4如何关闭息屏提醒?介绍 一键隐藏桌面图标快捷键组合键 最新版qq共同好友怎么看具体是谁最新版QQ共同好友功能 php中数组怎么赋值给数组php多个数组排序?介绍 如何查找最近保存的文件最近保存的文件查找方法介绍 苹果手机怎么预约到门店新iphone14怎么提前预约?介绍 myeclipse如何配置和启动tomcatmyeclipsetomcat7为什么突然用不了? 华为mate40官网价格表 如何在excel里选中隔开的两列excel怎么隔列? 台式电脑锁屏密码忘了怎么办电脑睡眠屏幕锁密码忘记怎么解除?介绍 hplaserjetmfpm132nw连接电脑hpcolorlasermfp178nw无线打印设置?介绍 苹果xr微信怎么单独加密码锁苹果手机应用未获得微信登录权限? windows7怎么让它一直是待机状态win7息屏但是不休眠?

微信公众号