当前位置:首页 > 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网络软件专家

  • 关注微信关注微信

猜你喜欢

热门标签

淘宝删除的足迹怎么恢复 华为通知铃声下载 抖音找到我的方式要开启吗介绍 做电商最忌讳什么 word目录自动生成怎么做 wps兼容性设置在哪 怎么在微视找人 手机禁止安装Root软件怎么办 oppo手机怎么制作音乐相册 freebuds3在苹果手机上怎么设置freebuds3怎么设置单耳声音大小?介绍 怎么强制清除vivo实名vivo账号实名不是我自己的怎么办? 硬盘数据恢复 画圆的基本方法有哪几种炸丸子怎么炸? iqooneo7竞速版耗电严重吗IQOONeo7竞速版续航时间 centos7怎么安装时间同步服务centos产生时间?介绍 照片上有裂纹怎么消除相机裂痕有什么危害? 知道怎么才能更快出单吗? 淘宝充值中心购物送充值金在哪里点淘直播间赠送物品怎么领取?介绍 itunes连接超时怎么解决iTunes无法备份怎么办? 华为mate40pro怎么强制恢复出厂华为40pro恢复出厂设置密码忘记? 在ps里面怎么排版一寸照片用ps做一寸二寸照的排版怎么做? 电脑上做颜色的标记怎么操作怎么在截图上画圈和箭头做重点标注来解说问题? sd卡显示异常如何处理 怎么存放老照片华为手机恢复出厂设置前如何保存照片? solidworks打印图纸全是空白的solidworks的命令窗口不见了?介绍 irobot扫地机器人充不上电 excel表格如何放大打印铺满a4纸 表格设置每个格子的文本自动换行表格里行叠在一起了怎么分开?介绍 oppo手机怎么设置网速最快OPPO手机限速后网速特别慢? iphone出现录制屏幕失败怎么解决苹果手机指纹录不上去怎么办?

微信公众号