Mysql 何时使用索引

Mysql 何时使用索引,mysql,sql,Mysql,Sql,关于何时使用索引有用,是否有一般的经验法则或公式 例如,在以下情况下,在id列上添加索引是显而易见的: 但是,如果具有2个可能的值,则以下内容可能在is_限定上没有用处: SELECT * FROM table WHERE is_qualified=1 有10[0-9]个可能值的项目如何?100个值[0-99]?您通常希望在什么时候添加索引,以及这与基数有什么关系?作为一般经验法则,优化器选择在where子句中使用索引的原因是为了减少正在读取的数据页的数量。因此,如果您的数据随机分布在页面上,

关于何时使用索引有用,是否有一般的经验法则或公式

例如,在以下情况下,在id列上添加索引是显而易见的:

但是,如果具有2个可能的值,则以下内容可能在is_限定上没有用处:

SELECT * FROM table WHERE is_qualified=1

有10[0-9]个可能值的项目如何?100个值[0-99]?您通常希望在什么时候添加索引,以及这与基数有什么关系?

作为一般经验法则,优化器选择在where子句中使用索引的原因是为了减少正在读取的数据页的数量。因此,如果您的数据随机分布在页面上,那么重要的问题是每个页面上有多少条记录,以及过滤器选择了多少条记录

假设每页有100条记录。然后,随机选择百分之一的记录可能会选择几乎所有的页面。在这种情况下,读取页面并对页面进行过滤可能比使用索引更快,因为几乎所有的数据页面都将被读取。T

因此,对于大多数表,返回一条或几条记录的查询最好使用索引。返回大量记录的查询可能不会受益于索引。一个推论是,对于小表,索引可能永远不会有用。如果数据放在一个页面上,那么使用where过滤器扫描页面的速度可能与使用索引一样快

也就是说,如果查询的选择性大于数据页上平均记录数的倒数,那么索引可能不会有用。这一点尽可能接近一般规则,但请继续阅读

指数的类型也会有所不同。如果条件是合格的,并且只有0.1%的记录满足此条件,那么索引可能会被证明是有用的。或者,如果1%是合格的,但记录非常大,所以一个页面上只有10个,那么索引可能是有用的。或者,如果is_qualified是聚集索引中的第一列,则所有带1的值都在少数页面上。对于聚集索引,即使对is_qualified=1有30%的选择性,也意味着只读取30%的数据页,这将使许多查询的时间减少三分之二


当然,这排除了在联接和按顺序排序的情况下使用索引,在这种情况下,即使是100%的选择性也可能受益于索引。但是,您的问题似乎是针对where子句中的筛选。

我认为您需要对使用索引进行一些研究和阅读。即使从您自己的示例来看,您也希望id列上有一个索引,因为您正在寻找一个特定的索引。。。但是,在IS_上有一个索引并不重要,因为它只能有两个可能的值。。。但是字母数字的ID可以有数十亿个值

索引用于帮助快速缩小范围并查找记录,而无需访问原始数据页以根据您希望提取的通用标准提取合格记录。根据您希望运行的常见查询的类型,索引甚至应该被视为具有多个列

让我们以一些数据场景列为例,假设一个表是每个id的子表,具有is_限定值和其他类型的值0-9,以及其他一些内容。。比如某物的日期,或者其他类型的描述

如果你只在ID上有一个索引,那么所有的ID记录都会被分组在一起,这很好,一旦你找到它们,你就可以快速浏览这些记录并得到结果

但是现在,假设您正在查找所有具有Is_Qualified=1且othertype列为3的ID。你不能很快得到它们,它们之间没有相关性。。。但是如果您有一个is_qualified、othertype、id的多键索引,那么您可以快速跳转到那些is_qualified=1和othertype=3的记录,然后您就可以使用所有的id了


将此应用于有数百万条记录要查询的表,并在没有索引的情况下运行查询,您将非常了解它们的用途,还将学习如何设计好有意义的索引。

更重要的是表中存在多少行,而不是它们是否有2个或10个可能的值。对于小于200-300行的表,不需要索引。如果有一百万行,即使列只有0和1,也最好有索引-这样可以避免完全扫描。例如,如果1M行中只有500行是1,则查询将跳过扫描999500行。

一个非常普遍的规则是索引所有主键列和参与外键关系的任何列。之后,索引将根据查询的性能来决定。当查询进行表扫描时,您将添加一个索引,而不是直接访问所需的行。通常,基数越高,索引越好。在您的特定情况下,没有10个或更少可能值的索引,i 11或更高可能值的ndex。确切的数字取决于关系数据库和数据库计算机的性能。添加索引并测量性能的增加或减少。
SELECT * FROM table WHERE is_qualified=1