我正在从事一个项目,每天需要添加/更新大约 100 万个网址。有些日子主要是更新,有些日子主要是添加,有些日子是混合。
因此,在每个查询中都需要在 url 表中查找 url 的唯一性。
如何真正快速地查找 url,因为目前索引设置在 url 列并且它工作正常但在接下来的几周内,如果索引保留在同一列上并且新记录将被添加到 RAM 将不够用百万。
这就是为什么我正在寻找一个解决方案,以便当总共有 150+ 百万个 url 时,它的查找应该很快。我正在考虑在 md5 上创建索引,但又担心发生碰撞的可能性。一位 friend 建议我也计算 crc32 哈希并与 md5 连接以使冲突可能性为零并将其存储在二进制(20)中这样只有 20 个字节将被用作索引而不是当前 varchar(255)设置为 url 列数据的 255 个字节类型。
目前总共有大约 5000 万个 url,8GB 内存可以正常工作。
昨天,我问了一个问题url text compression (not shortening) and storing in mysql与同一项目相关。
[编辑] 我想到了另一种解决方案,将 crc32 哈希仅以十进制形式放置以加快查找速度。并在应用程序级别移植检查返回了多少记录。如果返回超过 1 条记录,则还应匹配确切的 url。 这样也可以避免冲突,同时通过为每行存储 4 个字节而不是 20 个字节 (md5+crc32) 来保持 RAM 和磁盘空间的低负载。你说呢?
最佳答案
在阅读了您所有的问题(unique constraint makes hashes useless?、512 bit hash vs 4 128bit hash 和 url text compression (not shortening) and storing in mysql)后,我了解到您的问题大致如下:
"I need to store +150M URLs in mySQL, using 8GB of RAM, and still have a good performance on writing them all and retrieving them, because daily I'll update them, so I'll retrive a lot of URLs, check them against the database. Actually it has 50M URLs, and will grow about 1M each day in the following 3 monts."
是吗?
以下几点很重要: 您要保存的 URL 的格式如何?您是否需要回读 URL,或者只是更新有关它的信息,而不是基于部分 URL 等进行搜索?
假设 URL = "http://www.somesite.com.tv/images/picture01.jpg "并且您想要存储所有内容,包括文件名。 如果不同,请提供更多详细信息或更正我的答案假设。
如果可以通过替换 URL 中的某些字符组来节省空间。并非所有 ASCII 字符在 URL 中都是有效的,as you can see here: RFC1738 ,因此您可以使用它们来表示(和压缩)URL。例如:用字符0x81表示“http://”可以节省6个字符,用0x82表示“.jpg”可以再节省3个字节等。
有些词可能很常见(例如“图像”、“图片”、“视频”、“用户”)。如果您选择使用字符 0x90 到 0x9f + 任何其他字符(例如,0x90 0x01、0x90 0x02、0x90 0xfa)来对这些词进行编码,则可以使用 16 * 256 = 4,096 个“词典条目”来对最常用的词进行编码。您将使用 2 个字节来表示 4 - 8 个字符。
编辑:如您在上面提到的 RFC 中所读,在 URL 中您只能包含可打印的 ASCII 字符。这意味着只应使用字符 0x20 到 0x7F,并在 RFC 中进行了一些观察。因此,不应使用 0x80 之后的任何字符(十六进制表示法,在 ASCII 表中为十进制字符 128)。因此,如果可以选择一个字符(假设为 0x90)作为一个标志来指示“以下字节是字典中的指示,即我将使用的索引”。一个字符 (0x90) * 256 个字符(0x00 到 0xFF)= 字典中的 256 个条目。但是您也可以选择使用字符 0x90 到 0x9f(或十进制的 144 到 159)来指示它们是字典的标志,从而为您提供 16 *256 种可能性......
这两种方法可以为您节省大量数据库空间并且是可逆的,无需担心冲突等问题。您只需在应用程序中创建一个字典并使用它来编码/解码 URL,非常快速,使您的数据库更轻便。
由于您已经拥有超过 5000 万个 URL,您可以根据它们生成统计信息,以生成更好的字典。
使用散列:在这种情况下,散列是大小和安全性之间的权衡。如果发生碰撞会有多糟糕? 在这种情况下,您可以使用 birthday paradox来帮助你。
阅读文章以了解问题:如果所有输入(URL 中的可能字符)都相同,您可以估计发生冲突的概率。并且可以计算出相反的结果:给定您可接受的碰撞概率和您的文件数量,您的范围应该有多大?并且由于您的范围与哈希函数生成的位数完全相关...
编辑:如果您的散列函数提供 128 位,您将有 2^128 种可能的结果。所以,你在生日悖论中的“范围”是 2^128:这就像你的一年有 2^128 天,而不是 365。所以,你计算碰撞的概率(“两个 文件 < em="">出生 在同一天,年 有 2^128 天 而不是 365 天)。如果您选择使用给出的散列你是 512 位,你的范围将从 0 到 2^512...
再一次,记住 RFC:并非所有字节(256 个字符)在 Internet/URL 世界中都是有效的。因此,碰撞的概率降低。对你更好:)。
关于mysql - 考虑 RAM 的 url 或散列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7403167/
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b
我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa
我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin