首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在将"WHERE field=x“替换为”字段in (x,y)“之后不使用索引?

为什么在将"WHERE field=x“替换为”字段in (x,y)“之后不使用索引?
EN

Database Administration用户
提问于 2017-01-10 00:58:42
回答 2查看 55关注 0票数 2

有MariaDB 10.1.20。

  1. 创建表:创建表test2 ( id整数非空默认值0,标志枚举(‘y’,'n')非空默认值'n',键(Id),键(标志) ENGINE=InnoDB;
  2. 索引与往常一样使用:>从test2解释SELECT *,其中id = 1;+------+-------------+-------+------+---------------+------+---------+-------+------+-------+ _额外的+------+-------------+-------+------+---------------+------+---------+-------+------+-------+[计]康斯特·康斯特·1-第1段:+------+-------------+-------+------+---------------+------+---------+-------+------+-------+
  3. 但为什么这里不使用索引?>解释SELECT *从test2,其中id在(1,2);+------+-------------+-------+------+---------------+------+---------+------+------+-------------+ _~_参考文献[参考]:\x{e76f}\ +------+-------------+-------+------+---------------+------+---------+------+------+-------------+ \{e76f}\x{e76f}{##**$$}\{e76f}使用where +------+-------------+-------+------+---------------+------+---------+------+------+-------------+,使用NOCITNUFINNUNUNUUALUDIN1
EN

回答 2

Database Administration用户

发布于 2017-01-10 21:57:40

  • 首先,由于表很小(只有1行?),所以不能信任EXPLAIN提供在“真实”情况下应用的信息。
  • 索引标志很少有用。优化器看情况时(粗略地)说:“如果我需要扫描超过20%的表格,我不会费心使用索引。”这是一个合理的决定,因为使用索引需要在索引的BTree和数据的BTree之间跳跃。然而,尽管必须检查和丢弃不需要的行,但按顺序扫描表可能会更有效。
  • 好的,id不是一个标志。但是,对于优化器来说,最好是--因为您的表中只有1行?
票数 1
EN

Database Administration用户

发布于 2017-01-10 22:31:09

你有两件事可以看。

  • 蒙娜丽莎。
  • 指蒙娜丽莎的博物馆服务员。

你不能同时看他们两个。你想看哪一个?这就是查询计划员所处的困境。它知道只有两种选择。你在问,为什么它不直接看你想知道的东西?为什么不先问博物馆服务员?不过,这有点荒谬。

博物馆服务员可能会帮助你找到你需要去的地方,但只有当你看到不止一件东西的时候。

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

https://dba.stackexchange.com/questions/160486

复制
相关文章

相似问题

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