在下面的查询中
SELECT col1,col2
FROM table1
WHERE col3='value1'
AND col4='value2'
如果我有 2 个单独的索引,一个在 col3 上,另一个在 col4 上,其中哪一个将用于此查询?
我在某处读到,对于查询中的每个表,只使用一个索引。这是否意味着查询无法同时使用两个索引?
其次,如果我同时使用 col3 和 col4 创建了一个复合索引,但在 WHERE 中只使用了 col3 strong> 子句会不会影响性能? 示例:
SELECT col1,col2
FROM table1
WHERE col3='value1'
最后,在所有情况下都使用覆盖索引更好吗? MISAM 和 innodb 存储引擎有区别吗?
最佳答案
覆盖索引与复合索引不同。
If I have 2 separate indexes one on col3 and the other on col4, Which one of them will be used in this query ?
基数最高的索引。
MySQL 会统计哪些索引具有哪些属性。
将使用具有最大区分能力的索引(如 MySQL 的统计数据所示)。
I read somewhere that for each table in the query only one index is used. Does that mean that there is no way for the query to used both indexes ?
您可以使用子选择。
或者甚至更好地使用包含 col3 和 col4 的复合索引。
Secondly, If I created a composite index using both col3 and col4 together but used only col3 in the WHERE clause will that be worse for the performance? example:
复合指数
正确的术语是 compound 索引,而不是复合索引。
只会使用复合索引的最左边部分。
所以如果索引定义为
index myindex (col3, col4) <<-- will work with your example.
index myindex (col4, col3) <<-- will not work.
见:http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html
请注意,如果您选择最左侧的字段,则可以避免在 where 子句中不使用索引的该部分。
想象一下我们有一个复合索引
Myindex(col1,col2)
SELECT col1 FROM table1 WHERE col2 = 200 <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200 <<-- will NOT use index.
这样做的原因是第一个查询使用覆盖索引并对其进行扫描。
第二个查询需要访问表,因此扫描索引没有意义。
这仅适用于 InnoDB。
什么是覆盖索引
覆盖索引是指查询中选择的所有字段都被索引覆盖的情况,在这种情况下,InnoDB(不是MyISAM)永远不会读取表中的数据,而只会使用表中的数据索引,大大加快了选择。
请注意,在 InnoDB 中,主键包含在所有二级索引中,因此在某种程度上,所有二级索引都是复合索引。
这意味着如果您在 InnoDB 上运行以下查询:
SELECT indexed_field FROM table1 WHERE pk = something
MySQL 将始终使用覆盖索引并且不会访问实际的表。 虽然它可以使用覆盖索引,但它会更喜欢 PRIMARY KEY 因为它只需要打单行。
关于Mysql覆盖vs复合vs列索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8213235/
在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
文章目录一、概述简介原理模块二、配置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
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f
有人知道如何将capybarapoltergeist的用户代理覆盖到移动用户代理以进行测试吗?我发现了一些有关为seleniumwebdriver配置它的信息:http://blog.plataformatec.com.br/2011/03/configuring-user-agents-with-capybara-selenium-webdriver/这在capybara闹鬼中怎么可能? 最佳答案 请参阅poltergeistgithub页面上的链接:https://github.com/teampoltergeist/polte
如果我一直输入geminstallrails使用不同版本的Rails会怎样?例如,我可以输入:geminstallrails--verson3.2.10或geminstallrails这给了我版本3.2.12。问题每次安装都会覆盖之前的吗?它会删除所有旧文件并添加我正在安装的新版本吗?或者如果我运行它两次,它会保留一些文件吗?我正在使用Ubuntu。 最佳答案 它将安装两个独立的gem。实际的可执行文件rails将调用最新版本。你可以覆盖它__例如,rails_3.2.10_将执行Rails3.2.10。bundler顺便说一下,如