我很困惑如何最好地索引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)
非常感谢您提供的任何帮助。
由于
菲尔
答案 0 :(得分:2)
如果(col1, col2, col3, col4)
子句包含第一列的条件,则只能使用WHERE
上的索引。这意味着,如果查询在col1
上不包含条件,则根本无法使用索引(请参阅Multiple-Column Indexes)。如果您有此类查询,则应定义其他索引。这些可能是(col2, col3, col4)
,(col3, col4)
和(col4)
。
另一方面,(col1)
,(col2)
,(col3)
和(col4)
上的单独索引也是不错的选择。在这种情况下,不需要在索引中包含主键。我更喜欢这个解决方案,而不是上面提到的解决方案。
我发现你选择的主键很奇怪。如果(col1, col2, col3, col4)
是唯一的,请将其用作主键。如果您不希望四列上的主键(大多数人没有),则下一个选择通常是代理键(即MySQL中的auto_increment
列)。在这种情况下,(col1, col2, col3, col4)
上的唯一键会强制执行数据完整性。
答案 1 :(得分:0)
MySQL
能够在PK上的单个表中合并多个索引,只要您搜索确切的键值(不是范围)。
因此,如果您在col1
到colN
创建单独的索引,则可以运行此查询:
SELECT *
FROM mytable
WHERE col2 = 'B'
OR
col3 = 'C'
这将导致col2
和col3
合并上的索引合并(您将在index_merge using union(col2, col3)
输出中将其视为EXPLAIN
。
为了确保唯一性,只需将第一列声明为PRIMARY KEY
,只要您保持数据一致性(PK值确实是连接和分隔的col*
值),您的数据唯一性将受到PK的监管。