我尝试比较两个表之间的两个邮政编码列,以查看第二个表中是否缺少值。
我首先想用 mysql 来做,我的查询是这样的
'SELECT code FROM t1 WHERE t1 NOT IN (select code FROM t2)'
但它真的很慢所以我尝试了另一种方式:
我进行了两次选择,然后将结果与 array_diff() 进行了比较。
使用 mysql:几分钟,有时会崩溃
使用 PHP:不到 1 秒。
有人可以解释这些差异吗? 我的 SQL 查询有误吗?
最佳答案
如果您的主表有 50k 行,在查询中使用 sub select 将导致 1 + 50k 执行的选择。第一个表一个,50k selects,每行一个。服务器将该行与每次迭代主表时重新加载的子选择进行比较。这就是为什么您的 sql 代码需要时间,也可能是一个巨大的内存问题。
参见 serjoschas有关 joins 的信息以在 sql 中修复它,它应该比您的 php 解决方案更快。
Checking which values are missing within a table (compared to another) can easily be done with a LEFT or RIGHT JOIN they are just made for actions like this.. alternatively take a look at this: How to Find Missing Value Between Two Mysql Tables – serjoscha
一个解决方案:
SELECT code FROM t1
WHERE code NOT IN ( SELECT code FROM t2 )
将是:
SELECT t1.code
FROM t1
LEFT JOIN t2
ON t1.code = t2.code
WHERE t2.code is null
试一试。还可以查看 indexing as Cyclone建议:
If you don't have an index you should definitly add one since this will speed up your query. You could add an index like this: ALTER TABLE ADD INDEX code_idx (code) this should be done for both tables. If you then were to execute EXPLAIN for the query you would see something like Using where; Using index; Using join buffer which is good – Cyclone
索引 可加快查询速度。如果表只提供一列,查找与源表内容相同的索引表将是完全相同的冗余。否则,我强烈建议索引 t2 的代码列,这会大大提高性能并减少内存消耗。
关于PHP array_diff VS mysql 不在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28579485/
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我的Rails应用程序在rails4.0.2上,我在使用locale变量和params[:locale]切换翻译时遇到问题官方railsguide.我在mysite有一个单页网站.我的国际化路线:scope"(:locale)",locale:/en|de/do#myrouteshereend我的应用程序Controllerbefore_filter:set_localedefset_localeI18n.locale=params[:locale]||I18n.default_locale#Rails.application.routes.default_url_options[:l
更新:当输入“passenger-memory-stats”时,我显示:---Passengerprocesses---Processes:0我该如何解决这个问题?为什么即使我在httpd.conf中添加它并重新启动apache,passenger也不会启动?我无法让PhusionPassenger在服务器上运行RubyonRails。我已经按照Phusion网站上的所有说明安装了passenger并修改并创建了ApacheVirtualHost以指向新目录并验证所有.conf文件都已成功加载。还加载了httpd-Mpassenger_module。我还在本地主机上成功运行了Passe
我的mock只有在如下所示的beforeblock中时才有效。这只是我对我的问题的快速而肮脏的表述。从字面上看,当我将行从beforeblock移动到doesnotquack断言时,它停止模拟:(describe'Ducks',type::featuredobeforedo...allow_any_instance_of(Duck).toreceive(:quack).and_return('bark!')visitanimal_farm_pathendcontext'isanoddduck'it'doesnotquack'doexpect(Duck.new.quack).toeq('
假设我在一个非常长的模块路径中有一个类:sux=Really::Long::Module::Path::Sucks.new我能否以某种方式“导入”这个模块,这样我就可以直接使用这个类,而不必担心每次使用它时都要写这个路径?编辑:我知道在同一个模块中会让事情变得更容易。但在这种情况下,我不能在同一个模块中。 最佳答案 模块是ruby中的对象,因此您可以只引用较短的模块。Sux=Really::Long::Module::Path::SucksSux.new 关于ruby-如何不在rub
这个让我抓狂。我可以通过irb加载gem:steve@server:/var/www/listings$irbirb(main):001:0>Gem.path=>["/home/steve/.gem/ruby/1.9.1","/usr/local/ruby/lib/ruby/gems/1.9.1"]irb(main):002:0>require'nokogiri'=>true但我无法通过Rails控制台加载它:irb(main):001:0>Gem.path=>["/home/steve/.gem/ruby/1.9.1","/usr/local/ruby/lib/ruby/gems/1
有没有办法在不打开临时文件的情况下创建它?我必须运行一个可执行文件,将它的输出重定向到一个文件,然后读取并解析它。tempfile创建的所有内容都已打开,这会触发错误,因为文件已锁定。 最佳答案 你也可以使用Dir::TmpnameDir::Tmpname.create('your_application_prefix'){|path|putspath}路径将包含唯一路径参见https://github.com/ruby/ruby/blob/ruby_1_9_3/lib/tmpdir.rb#L116
x==User返回true,但casex语句不运行与User关联的block.这里发生了什么?u=User.new#=>#x=u.class#=>Userx==User#=>truecasexwhenUserputs"constant"when"User"puts"string"elseputs"nothing?"end#=>nothing? 最佳答案 大小写比较使用===而不是==。对于许多对象,===和==的行为是相同的,参见Numeric和String:5==5#=>true5===5#=>true"hello"=="hell
一般Ruby问题:在Ruby中,我经常看到类内部的代码,而不是方法的一部分。例如:classDooDadattr_accessor:fooend或classTeacher我认为attr_accessor和has_many是分别使用:foo或:students参数调用的方法,是对的吗?如果是这样,这些语句何时执行。我试过这个:classDooDadattr_accessor:fooputs"Ihappened!"@foo=7endnew方法似乎没有运行这些部分:dd=DooDad.newdd.foo输出nil,并且从不吐出任何puts东西这一切究竟是如何运作的?