2

我对如何最好地在 MySQL 中为表建立索引感到困惑,并且需要有关要使用的最佳索引构造类型的帮助。目前我在这个表上使用唯一键索引,但不知道这是否是最好的使用方法,在某些情况下,由于 MySQL 的限制,我不能使用这种类型的索引。

该表由一个主键和 n 列组成,在这种情况下保持简单 n=4。所以表格看起来像这样:pk, col1, col2, col3, col4

col1-n 中的值是 VARCHAR,通常长度在 1 到 4 个字符之间。主键是 col 值的串联。所以典型的行可能如下所示:

A:B:C:D, A, B, C, D
A:B:C:E, A, B, C, E
A:B:F:F, A, B, F, F

其中第一个元素是主键,后续元素是 col1、col2 等。

该表需要针对查询而不是插入进行优化。我希望执行的查询将有一个 WHERE 子句,我们知道第 1-4 列中的一些值。因此,例如,我可能想查找第二列为“B”或“C”的所有行。一旦我有了主键,我就用它来加入另一个表。

我在 col1-4 上创建了一个唯一键(因为它们是唯一的)。问题是,一旦 n 变大(>16),我就不能再创建唯一键索引(MySQL 被限制为 16 列用于唯一键约束)。这不是问题,因为主键可确保唯一性。但是,我不确定两件事:

a) 为了优化查询速度,唯一键是一个很好的索引吗?

b) 当我不能使用唯一键时,我应该使用什么索引?

我有以下选项,但我不确定哪个(如果有)是最好的:

a) 在 (col1, col2, col3, col4) 上创建单个索引

b) 每列创建一个索引 (col1), (col2)…(col-n)

c) 为每个 col 创建一个索引,其中包含的 pk (pk, col1), (pk, col2), (pk, col-n)

非常感谢您提供的任何帮助。

谢谢

菲尔

4

2 回答 2

2

仅当子句包含第一列的条件时(col1, col2, col3, col4),才能使用索引。WHERE这意味着,如果查询不包含 on 条件col1,则根本无法使用索引(请参阅多列索引)。如果您有此类查询,则应定义其他索引。这些可能(col2, col3, col4)(col3, col4)(col4)

另一方面,在 、(col1)和上单独索引也是一个不错的选择。在这种情况下,不需要在索引中包含主键。我更喜欢这个解决方案而不是上面提到的解决方案。(col2)(col3)(col4)

我发现您选择的主键很奇怪。如果(col1, col2, col3, col4)是唯一的,则将其用作主键。如果您不想在四列上使用主键(大多数人不这样做),那么下一个选择通常是代理键(即auto_incrementMySQL 中的列)。在这种情况下,唯一的密钥(col1, col2, col3, col4)强制执行数据完整性。

于 2013-04-03T12:49:27.087 回答
0

MySQL只要您正在搜索确切的键值(而不是范围),就可以在 PK 上的单个表中合并连接多个索引。

因此,如果您在col1to上创建单独的索引colN,则可以运行此查询:

SELECT  *
FROM    mytable
WHERE   col2 = 'B'
        OR
        col3 = 'C'

这将导致索引打开col2col3合并(您将index_merge using union(col2, col3)EXPLAIN输出中看到它)。

为确保唯一性,将第一列声明为 就足够了PRIMARY KEY,因此只要保持数据一致性(PK 值确实是col*连接和分离的值),您的数据唯一性将由 PK 监管。

于 2013-04-03T12:56:30.903 回答