CREATE TABLE test (
id INT NOT NULL,
last_name CHAR(30) NOT NULL,
first_name CHAR(30) NOT NULL,
PRIMARY KEY (id),
KEY `first_name` (first_name),
KEY `last_name` (last_name),
KEY `last_first` (last_name,first_name)
);
SELECT * FROM test WHERE first_name = 'A';
SELECT * FROM test WHERE last_name= 'A';
SELECT * FROM test WHERE last_name= 'A' AND first_name = 'A';
最佳答案
答案:测试一下。答案很大程度上取决于您的数据和查询,因此我们无法给出适用于所有场景的确定答案。只要你还没有测试过,就不要使用额外的综合指数。这听起来像是过早的优化。
与只有单行索引相比,复合索引可以加快速度。你的最后一个查询可能会被它加速。让我从深入挖掘数据库的内部工作开始。
在查询处理中使用复合索引
复合索引允许对第三个查询执行单个索引扫描,以便快速找到所有匹配的元组。也就是说,dbms只要求索引“给我所有匹配这两个谓词的元组”。综合指数能够很快确定这一点。
相反,如果只使用非复合索引,则无法进行此类扫描。相反,rdbms将有两个选项来回答您的查询:
执行所谓的索引交集:在两个索引中查找匹配的元组,然后计算交集
只使用其中一个索引并使用第二个谓词筛选输出
我不确定这些策略中的哪一个将由mysql执行。检查生成的计划以确定。
有没有提速?
如上所述,如果您有复合索引,那么rdbms有三种可能处理第三个查询:
对复合索引的单索引扫描
单行索引的索引交集
使用第二个谓词使用一个索引和筛选器元组
现在,为了回答一个综合指数是否能加快速度,我们必须确定哪种方法是最快的。简而言之:这取决于数据。是的,很有可能复合索引的索引扫描最快。但问题是它的速度有多快?因为一个额外的指数是昂贵的,只有一个真正明显的加速将证明一个额外的综合指数。
尤其是谓词的选择性决定了复合索引是否值得。例如,假设90%的元组满足last_name= 'A'(即,此谓词的选择性较低)。那么,综合指数将是非常多余的。简单地使用方法(3),即在上一个查询中不使用索引的情况下过滤谓词,将比组合索引扫描同样快。第二个解决方案是最慢的,因为交叉口的结果相当大。
但现在考虑只有0.00001%的元组满足谓词。然后,(1)将比(3)有巨大的好处,因为它只选择匹配的元组,而(3)选择很多元组,然后过滤掉大部分元组(因为它们与谓词不匹配)。(2)在这种情况下是第二快的解决方案(因为交叉点的大小非常小),但它不会像复合扫描那样快,因为构建交叉点总是有点昂贵(例如,交叉点可以通过使用散列连接来完成)。
总之,复合索引的加速速度有多大取决于您使用的数据和谓词。所以,你得测试一下。我们不能在这里给出确切的答案。
这还取决于优化器有多聪明。因此,当您更新mysql时,它可能会改变,因为优化器可能已经改变,现在选择更好(或更糟)的策略来处理您的查询。
附加综合指数的缺点是什么?
一个额外的指数需要两样东西:
空间,当然。
更新时间:索引必须保持最新,因此更改索引列的插入、删除和更新会变慢。如果有很多更新,附加索引甚至可能会降低总体性能。
什么时候应该使用附加的复合索引?
如上所示,附加索引有成本,但可能会加快查询速度。以下是一些何时使用其他复合索引的启发式方法:
有许多查询实际上同时使用这两个列(对于所有其他查询,附加索引不会产生任何好处)
这些查询中的谓词是高度选择性的
你有足够的空间,即为额外的索引支付空间不会伤害你
您的数据不是太动态,即您只有很少的更新,但有更多的查询,因此更新附加索引不会对您造成伤害。
然而,最佳答案是何时使用它将是以下IMHO:
将附加的复合索引视为优化的一种形式。因此,著名的规则适用:“程序优化的第一条规则:不要这样做。程序优化的第二条规则(仅限专家!):暂时不要这样做。“
只有在确定多列查询是应用程序的瓶颈之后,才能执行此优化。测量差异。如果有一个相当大的索引,请保留该索引,否则将其删除。
关于mysql - 如果一个表在同一个字段上有单个索引和复合索引,那会好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25886746/
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更