首页 > 节日习俗

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分词

原文标题:mysql全文索引实现原理 mysql innodb建立普通索引怎么写?,如若转载,请注明出处:https://www.bjtdsx.com/bjtdsx4/33687.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「天地水秀」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。