您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据结构与算法 > key-value数据库
2010-04-02张宴数据库的性能问题单表的记录数不断增加,查询效率降低。Web2.0应用的写操作越来越多,传统的MySQL一主库多从库、读写分离模式作用有限。随着并发请求数增长,MySQL性能急剧下降。MySQL5.5m2数据库压力测试DellR900system(16cores,32GBofRAM,FusionIO+RAID10)TokyoCabinet及TokyoTyrant简介TC(TokyoCabinet)是日本人平林幹雄开发的一款Key-Value键值数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.402秒,读取100万条数据只需0.334秒。TT(TokyoTyrant)是由同一作者开发的TokyoCabinet数据库网络接口。它拥有自己的协议,并支持Memcached兼容协议,也可以通过HTTP协议进行数据交换。哈希数据库读写速度大约在50000次/秒。TC和TT目前运行在日本最大的SNS网站MIXI,在国内也有大量的生产环境应用。TT、Memcached、MySQL比较10000线程时,写入性能TT、Memcached、MySQL比较10000线程时,读取性能TokyoCabinet的数据库类型TCHDB哈希数据库TCBDBB+Tree数据库TCFDB定长数据库TCTDB表格数据库TCMDB内存哈希数据库TCNDB内存B+Tree数据库TCHDBTCHDB哈希数据库的优化很多人反应TT/TC插入数据超过一定数量后,性能会大幅度下降?先对TC做个测试:写入100万条:tchtestwritetest.tch1000000时间:0.732秒速度:1366120条/秒写入200万条:tchtestwritetest.tch2000000时间:1.718秒速度:1164144条/秒写入500万条:tchtestwritetest.tch5000000时间:21.529秒速度:232244条/秒从测试来看,写入500万条数据,性能确实降低。但是,原因呢?TCHDB哈希数据库的优化修改参数后,再测试:写入100万条:tchtestwrite-xm536870912test.tch10000005000000时间:0.580秒速度:1724137条/秒写入200万条:tchtestwrite-xm536870912test.tch20000005000000时间:1.105秒速度:1809954条/秒写入500万条:tchtestwrite-xm536870912test.tch50000005000000时间:2.737秒速度:1826817条/秒可见,性能提升了不少,随着写入数据量地增加,速度依旧不减。TCHDB哈希数据库的优化关键参数(CAPI):booltchdbsetxmsiz(TCHDB*hdb,int64_txmsiz);Xmsiz指定了TCHDB的扩展MMAP内存大小,默认值为67108864,也就是64M,如果数据库文件超过64M,则只有前部分会映射在内存中,所以写入性能会下降。其他参数(CAPI):booltchdbtune(TCHDB*hdb,int64_tbnum,int8_tapow,int8_tfpow,uint8_topts);bnum指定了bucketarray的数量。推荐设置bnum为预计存储总记录数的0.5~4倍,使key的哈希分布更均匀,减少在bucket内二分查找的时间复杂度。TCHDB哈希数据库的优化如果存储的.tch“数据库文件大小”=“MMAP内存大小”,TCHDB哈希数据库是个不错的选择。TCHDB查找速度非常快,但是对内存的要求相对较高。实例:TokyoTyrant的哈希数据库,优化参数如下,bnum设置为2000万条,xmsiz设置为1GB:ttserver-host10.19.1.195-port11211-thnum4-dmn-pid/data0/ttserver/ttserver.pid-log/data0/ttserver/ttserver.log-le-ulog/data0/ttserver/-ulim128m-sid195-rts/data0/ttserver/ttserver.rts/data0/ttserver/database.tch#bnum=20000000#xmsiz=1073741824TCBDBTCBDBB+Tree数据库的优化做个测试:写入100万条:tcbtestwritetest.tcb1000000时间:0.994秒速度:1006036条/秒写入200万条:tcbtestwritetest.tcb2000000时间:2.028秒速度:986193条/秒写入500万条:tcbtestwritetest.tcb5000000时间:5.276秒速度:947687条/秒从测试来看,TCBDB写入速度虽然比TCHDB低45%左右,但可以看出,写入500万条数据时,B+Tree的写入速度保持稳定。TCBDBB+Tree数据库的优化修改参数后,再测试:写入100万条:tcbtestwritetest.tcb1000000102420485000000时间:0.981秒速度:1019367条/秒写入200万条:tcbtestwritetest.tcb2000000102420485000000时间:1.856秒速度:1077586条/秒写入500万条:tcbtestwritetest.tcb5000000102420485000000时间:4.448秒速度:1124101条/秒TCBDB没有开启xmsiz扩展MMAP内存,写入大量数据时,速度仍然能够得以保证。TCBDBB+Tree数据库的优化性能微调参数(CAPI):booltcbdbtune(TCBDB*bdb,int32_tlmemb,int32_tnmemb,int64_tbnum,int8_tapow,int8_tfpow,uint8_topts);lmemb用于指定被缓存的页级节点数nmemb用于指定被缓存的非页级节点数,通常为页级节点数的两倍bnum用于指定bucketarray的数量。bnum的数量应该大于存储总记录数的1/128。TCBDBB+Tree数据库的优化TCBDB(查找的时间复杂度为“O(logn)”)虽然速度比TCHDB(查找的时间复杂度为“O(1)”)慢一些,但是,它对内存的依赖度要比TCHDB小得多,随着数据量增大,写入速度也稳定,适合存储大量数据。生产环境,我们存储7GB的数据,TCBDB只使用了160M的内存缓存,而TCHDB则需要设置7GBxmsiz内存才能保证速度。实例:TokyoTyrant的B+Tree数据库,优化参数如下:ttserver-host10.19.1.195-port11211-thnum4-dmn-pid/data0/ttserver/ttserver.pid-log/data0/ttserver/ttserver.log-le-ulog/data0/ttserver/-ulim128m-sid195-rts/data0/ttserver/ttserver.rts/data0/ttserver/database.tcb#lmemb=1024#nmemb=2048#bnum=20000000TCFDBTCFDB定长数据库的优化参数设置(CAPI):booltcfdbtune(TCFDB*fdb,int32_twidth,int64_tlimsiz);width用于设置每条记录的长度(字节数);limsiz用于设置总长度(字节数),存储的总数据字节数不能超过limsiz设定的值。TCFDB定长数据库读写速度快,但是存储的数据量有限。数据库文件必须在内存中完全映射。TCTDBTCTDB表格型数据库TCTDB是在TCHDB哈希数据库的基础上,对value部分做的增强,因此,性能优化参数跟TCHDB类似。TCTDB中,key相当于关系型数据库中的主键ID,name相当于字段名,value相当于字段值。TCTDB表格型数据库的特征1、可以根据“字段”检索出符合条件的key(CAPI):voidtctdbqryaddcond(TDBQRY*qry,constchar*name,intop,constchar*expr);Name即字段名,op代表操作类型,expr为操作对象。Op操作类型可以分为两类:字符型运算和数值型运算。TCTDB表格型数据库的特征数值型运算符:NUMEQ:表示等于操作对象的数值(=)。NUMGT:表示比操作对象的数值要大()。NUMGE:表大于或等于操作对象的数值(=)。NUMLT:表示比操作对象的数值要小()。NUMLE:表示小于或等于操作对象的数值(=)。NUMBT:表示其大小处于操作对象文字段中被逗号分开的两个数值的中间(between100and200)。NUMOREQ:表示同操作对象文字段中被逗号分开的多个数值中的其中一个是相同的(IN(100,200,278))。TCTDB表格型数据库的特征文本型运算符:STREQ:表示与操作对象的文字内容完全相同(=)。STRINC:表示含有操作对象文字的内容(LIKE‘%文字%’)。STRBW:表示以操作对象的文字行列开始(LIKE‘文字%’)。STREW:表示到操作对象的文字行列结束(LIKE‘%文字’)。STRAND:表示包含操作对象的文字行列中右逗号分开部分的字段的全部(nameLIKE‘%文字㈠%’ANDnameLIKE‘%文字㈡%’)。STROR:表示包含操作对象文字段中逗号分开部分的其中一部分(nameLIKE‘%文字㈠%’ORnameLIKE‘%文字㈡%’)。STROREQ:表示与操作对象文字段中逗号分开部分的其中某部分完全相同(name=‘文字㈠’ORname=‘文字㈡’)。TCTDB表格型数据库的特征2、可以对“字段”建立索引,支持UTF-8全文检索(CAPI):booltctdbsetindex(TCTDB*tdb,constchar*name,inttype);type为索引类型,值如下:TDBITLEXICAL:创建文本型索引TDBITDECIMAL:创建数值型索引TDBITTOKEN:创建标记倒排索引TDBITQGRAM:创建q-gram倒排索引TDBITOPT:优化索引TDBITVOID:删除索引TCTDB表格型数据库的特征3、支持按“字段”排序(CAPI):voidtctdbqrysetorder(TDBQRY*qry,constchar*name,inttype);type为排序类型,值如下:STRASC:表示按照文本型字段内的文本内容在字典中排列顺序的升序。STRDESC:表示按照文本型字段内的文本内容在字典中排列顺序的降序。NUMASC:表示按照数值大小的升序。NUMDESC:表示按照数值大小的降序。TCTDB表格型数据库的特征4、支持检索结果数量限制(CAPI):voidtctdbqrysetlimit(TDBQRY*qry,intmax,intskip);相当于SQL语句中的“limitskip,max”TCTDB表格型数据库的特征回顾TCTDB数据库的特征:TCTDB即具备了Key-Value数据库的高效读写性能,又具备了MySQL单表能实现的一些功能,即:SELECT….FROMtableWHERE….ORDERBY….LIMITxxx,xxxTCTDB表格型数据库的不足之处1、功能的增强,也就意味着要牺牲一些性能。TCTDB表格型数据库的平均读取速度大约在40万条/秒,相比TCHDB哈希数据库的180万条/秒和TCB
本文标题:key-value数据库
链接地址:https://www.777doc.com/doc-5935360 .html