mysql - 复合索引在MySQL中有方向吗?

标签 mysql covering-index

什么时候需要以下内容:

create index i_t_a_b on t(a,b);

create index i_t_b_a on t(b,a);

最佳答案

当您想要最大的检索速度并且在连接或 where 条件中都有两列时,但有时列 a 具有更高的选择性,有时列 b 具有更高的选择性,并且您希望从单个索引中利用这一事实。

此外,我认为您的数据大小/机器性能之比应该相当高,同时您将不得不(猜测)愿意将任何改进称为必要(即使只有几个百分比)。

不过,经验告诉我们,事情取决于很多因素;使用特定的 RDBMS 和应用程序环境,您可以更好地运行自己的基准测试。

编辑: 关于复合指标的进一步解释。 来自 wikipedia :
“列在索引定义中的顺序很重要。可以仅使用第一个索引列检索一组行标识符。但是,检索(在大多数数据库上)是不可能的或高效的仅使用第二个或更大索引列的行标识符集。
例如,想象一个电话簿首先按城市组织,然后按姓氏,然后按名字。如果给定城市,您可以轻松提取该城市所有电话号码的列表。然而,在这本电话簿中查找给定姓氏的所有电话号码将是非常乏味的。您必须在每个城市的部分中查找具有该姓氏的条目。”

Wikipedia 的解释可能过于简单,但它为您提供了基本概念(作为类比,请记住电话簿通常具有聚集索引,而这不是您的通用数据库索引)。

根据索引的大小、数据结构的大小、可用内存、索引第一列的选择性,使用错误排序的索引比使用表扫描的成本仍然要低得多。

啊,只是想到了一个更好的类比与你正在寻找的例子 想象一本不错的教科书,它会有目录,其中包含章节和子章节以及它们所在的页数(这是一个非聚集索引,它包含指向数据记录的指针 - 页)。 现在假设教科书是基于 SQL-92 标准的,那么 TOC 中的大部分术语都是 SQL 术语(请保持这个假设)。 您还会在书的末尾有另一个索引,它会按字母顺序(假设有主要章节名称)和页码列出所有有趣的术语。

对于诸如此类的问题 “告诉我出现 DISTINCT 的所有章节”您将使用第二个索引。 (因为后期字段选择性高)

对于诸如此类的问题 '告诉我出现在第一章下的术语的数量'你会使用 TOC

所以对于诸如此类的问题 “SELECT 是否在 DML 章节中进行了描述?”您可以使用其中任何一个索引。 (因为两个领域的选择性都很高) 但是,如果 DML 本身的 TOC 有 3 页长,而索引中的 SELECT 条目只有十五行,您可能会转到第二个,这是您从两个索引中获益的一个例子。

现在,如果您认为这太过牵强,请考虑扫描国会图书馆的数据库。 :)

正如我之前所说,所有计划都很好,但最后一定要运行您自己的基准测试。

关于mysql - 复合索引在MySQL中有方向吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500440/

相关文章:

MySQL 连接操作以获取有关帖子的信息以及撰写​​该帖子的用户名

php - 使用 curl 从数据库传输数据的最佳方法是什么

php 到 AJAX 表单提交

mysql - 一张大 table 或多张小 table ,效率/良好实践

python - 无法通过套接字'/tmp/mysql.sock 连接到本地 MySQL 服务器

sql-server - SQL Server 中覆盖和单个索引的重叠

sql-server - 覆盖索引如何满足多个查询?

mysql - 将覆盖索引与 MySQL 中的唯一约束相结合

mysql - 如何检查 MySQL 查询是否正在使用覆盖索引?