草庐IT

mysql - 只有 Mysql OR mysql+sqlite OR mysql+自己的解决方案

coder 2023-10-23 原文

目前我正在构建相当大的网络系统,我需要强大的 SQL 数据库解决方案。我选择 Mysql 而不是 Postgres,因为一些任务需要只读(MyISAM 引擎)而其他任务需要大量写入(InnoDB)。

我对这个只读功能有疑问。它必须非常快。用户必须在不到一秒的时间内得到答案。 假设我们有一个索引良好的表,名为“object”,行数不超过 1000 万,另一个名为“element”的表,行数约为 1.5 亿。 我们还有一个名为“element_object”的表,其中包含将表“element”中的对象与表“object”(数亿行)连接起来的信息

所以我们要对表“element”和“element_object”进行分区,得到 8192 个表“element_hash_n{0..8191}a ”和 24576 个表“element_object_hash_n{0..8191}_m{0..2}”。

用户问题的答案需要两步搜索:

  1. 从表“element_hash_n”中找到元素的 id
  2. 在表“object”上执行主 sql 选择并与表“element_object..hash_n_m”连接以使用找到的(从第一步)ID 过滤结果

我想知道第一步: 什么会更好:

  1. 在 mysql 中存储(全部)超过 32k 个表
  2. 创建一个 sqlite 数据库并在其中存储 8192 个表以用于第一步目的
  3. 创建 8192 个不同的 sqlite 文件(数据库)
  4. 在文件系统中创建 8192 个文件并制作自己的二进制解决方案以查找 ID。

对不起我的英语。它不是我的母语。

最佳答案

我想你让位给了很多分区。如果您有超过 32000 个分区,您将面临巨大的管理开销。给定名称 element_hash_* 它就像您想对元素进行散列并以此方式对其进行分区一样。但是散列会给你一个(很可能)在所有分区上均匀分布的数据。我看不出这应该如何提高性能。如果您的数据是通过所有这些分区访问的,那么通过内存大小的分区不会获得任何好处 - 您将需要从另一个分区加载每个查询数据。

我们在事务系统上使用分区,其中超过 90% 的查询使用当天作为条件。在这种情况下,基于天的分区工作得很好。但是我们只有 8 个分区,然后将数据移动到另一个数据库以进行长期存储。

我的建议:尝试快速找出需要哪些数据并将其组合在一起。您将需要进行自己的性能测试。如果以如此快的速度交付数据如此重要,那么应该有足够的管理支持来构建一个像样的测试环境。 也许您的测试结果会表明您根本无法使用关系数据库系统足够快地传送数据。如果是这样,您应该查看 NoSQL(如 Not only SQL)解决方案。

您使用什么技术构建您的网络系统?您也应该测试这部分。如果您在性能不佳的 Web 应用程序中浪费时间,那么超快的数据库对您没有多大帮助。

关于mysql - 只有 Mysql OR mysql+sqlite OR mysql+自己的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8619700/

有关mysql - 只有 Mysql OR mysql+sqlite OR mysql+自己的解决方案的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  4. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置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

  7. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  8. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  9. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。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

  10. ruby-on-rails - 只有当不是 nil 时才执行映射? - 2

    如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e

随机推荐