使用哪个索引

Posted

技术标签:

【中文标题】使用哪个索引【英文标题】:Which Index to use 【发布时间】:2017-12-11 17:56:55 【问题描述】:

我有两个经常使用的查询,因此我应该真正使用索引,在查看所有索引后,我仍然无法确定哪个更适合以下查询:

select distinct F.nif, F.nome
from fornecedor F, produto P
where F.nif = P.forn_primario
and P.categoria = 'Frutos'

select ean, count(nif)
from produto P, fornece_sec F
where P.ean = F.ean
group by P.ean

由于第一个查询是多列的,我认为它应该是 B 树,但在文档中他们没有提到来自不同表的列。

【问题讨论】:

如果您不知道要改进什么,也许它不需要任何改进?您的请求实际上需要相当长的时间来响应吗? 【参考方案1】:

当您不确定时,您可以按照您的方式对潜在候选人进行测试(希望在您的开发环境中)。所以你用 b-tree 创建它然后运行 ​​

explain analyse select ...

用你的结果做一个矩阵

b-tree(select whatever)     hash (select whatever)
time 0.0001 ms              time 9999 ms
plan ...                    plan ...

这就是您如何准确地知道您需要的那个,因为我们不知道您的表格的大小、您的列的选择性以及很多其他的东西

可能在您的连接和谓词上使用 btree :)

【讨论】:

非常感谢您的帮助,我现在要测试您的解决方案 :)【参考方案2】:

对于这个查询(注意:使用正确的现代语法编写):

select distinct F.nif, F.nome
from fornecedor F join
     produto P
     on F.nif = P.forn_primario
where P.categoria = 'Frutos';

您可能希望在produto(categoria, forn_primario)fornecedor(nif, nome) 上建立索引。我会质疑您是否真的需要select distinct,如果有更多信息,可能会建议使用另一个版本的查询。

对于这个查询(注意:正确编写以避免语法错误):

select P.ean, count(F.nif)
from produto P join
     fornece_sec F
     on P.ean = F.ean
group by P.ean;

您希望每个表中的ean 都有索引。我建议您使用count(*) 而不是count(nif),除非您特别想计算该列的非NULL 值。

【讨论】:

我根本无法更改查询,这是所要求的类型,因此我必须为这些类型的查询创建最佳索引

以上是关于使用哪个索引的主要内容,如果未能解决你的问题,请参考以下文章

过滤和排序以下哪个查询将使用索引?

该语句将使用哪个普通索引

我应该使用哪个索引进行 $geoWithin 搜索?

如何使用变量来确定要使用列表中的哪个索引

sqlite 怎么知道索引在哪个索引btree里

来来来!尚硅谷黑马的java哪个好