首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql InnoDb中的索引使用

问MySql InnoDb中的索引使用
EN

Stack Overflow用户
提问于 2022-04-21 19:00:37
回答 2查看 47关注 0票数 0

我想知道Mysql InnoDb引擎中的索引使用情况。

下面是简化的示例。

  1. 域

A,b,c,d

  1. indexes

  • a(pk)
  • (a,b,d) (复合index)
  1. Query )

选择。其中a=3和b >= 5,c=4阶,d极限为10;

Q.1在这种情况下,使用多长时间的索引?(a,b ?)(a,b,d?)

Q.2如何优化这种情况下的索引?

Q.3是否可以在辅助索引中包含主键(聚集索引)?或者比较WHERE子句末尾的主键字段更好?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2022-04-21 19:11:51

Q1

跑跑你的马。该查询可能不会使用索引,但您可以获得执行计划并进行验证。

Q2

下面的索引可以提高性能。同样,验证执行计划:

代码语言:javascript
复制
create index ix1 on t (a, c, b);

您甚至可以尝试“覆盖索引”:

代码语言:javascript
复制
create index ix1 on t (a, c, b, d);

为了一点额外的性能(代价是一个更重的指数)。

Q3

在InnoDB中,PK总是包含在所有二级索引中。这不是MyISAM的情况,但这不是您的用例。

票数 0
EN

Stack Overflow用户

发布于 2022-04-24 18:33:26

在二级索引的开头有PK是非常罕见的,这是非常有用的。它可能有用的一种情况是,整个SELECT所需的所有列都包含在索引中。你的例子不是那种情况。(比照:“覆盖指数”)

AND'd从句在WHERE中的顺序并不重要。INDEX中列的顺序确实很重要。

除了“覆盖”,没有任何索引将完全优化Where a = 3 And b >= 5 And c = 4 Order by d Limit 10。有关查找最优索引的算法,请参见。如前所述:(a,c,b)或(c,a,b)。

只有在“覆盖”的情况下,(a, c, b, d)才会有所帮助。(SELECT ...中有什么??

(a, b, d)可能运行得更快,但它是有风险的。如果很快就能找到所需的10行,就会很快找到。但是,如果表中没有完整的10行,则将是缓慢的表扫描。

“使用文件”是ORDER BY和/或GROUP BY的结果。索引可能很有用,但仅使用索引无法完成查询。

是的,PK列总是包含在InnoDB辅助键中。但他们会被钉在最后。请记住,INDEX中的顺序很重要,正如我的食谱所指出的,=列需要首先在索引定义中列出。

“我怎样才能用索引覆盖WHERE和ORDER BY子句?”虽然一个“覆盖”索引可能“涵盖”两个子句,但由于“范围”测试(<)和ORDER BY的混合,它不能阻止"filesort“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71959669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档