索引和多列的主键

问题描述 投票:27回答:6

去搜索并没有找到这个问题的答案具体noob问题。我的道歉,如果我错过了。

在MySQL数据库中我有如下主键的表

PRIMARY KEY ID(发票,项目)

在我的应用程序也将频繁地通过自己选择的“项”和不经常上唯一的“发票”。我假设我会从这些列的索引中获益。

当我定义了下面的MySQL不会抱怨:

INDEX(发票),INDEX(项目),PRIMARY KEY ID(发票,项目)

但我没有看到任何证据(使用形容 - 我知道怎么看的唯一方式)单独的索引已经建立了这两列。

所以,问题是,是组成一个主键自动单独建立索引的列?此外,有没有更好的办法不是描述对探索我的表结构?

sql mysql primary-key indexing
6个回答
44
投票

我并不十分熟悉MySQL的指标的内部,但对我很熟悉这两个数据库厂商的产品(MSSQL,Oracle)的指数是平衡的树结构,它的节点被组织成列的排序的元组索引定义(在序列定义)

所以,除非MySQL的很不同,(可能不是),任何综合指数(上多列)可以是需要通过在索引中的列的子集来过滤或排序任何查询可用,只要列的列表是兼容的,也就是说,如果列,当测序一样列在整个指数的排序名单,是一套完整的索引列,开始在实际的指数序列开始的有序的子集,与除结尾没有差距?

换言之,这意味着,如果你有一个索引(A,B,C,d),该过滤器上的(a),(A,B),或(A,B,C)也可以使用索引的查询但需要过滤的(b)查询,或(c)或(b,C)将无法使用该索引...

所以你的情况,如果你经常需要单独进行过滤或排序的列项,则需要自行添加该列另一个指标...


15
投票

我个人使用phpMyAdmin查看和编辑MySQL数据库的结构。它是一个Web应用程序,但它运行的本地Web服务器(我在我的机器上运行Apache的一个实例,这和phpPgAdmin的)上的不够好。

至于(invoice, item)的复合键,它的作用类似于(invoice, item)invoice的索引。如果您想索引只是item你必须自己添加索引。你的PK将invoice,然后进行排序由item其中invoice是多个记录一样。虽然在复合PK的顺序并不唯一性执法关系,的确很重要的访问。

你的桌子上,我会用:

PRIMARY KEY id (invoice, item), INDEX (item)

4
投票

要返回表索引信息,您可以使用:

SHOW INDEX FROM <table>;

请参阅:http://dev.mysql.com/doc/refman/5.0/en/show-index.html

要查看表信息:

SHOW CREATE TABLE <table>;

请参阅:http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html

主键索引,所以没有必要创建额外的索引。您可以在CREATE TABLE语法下找到更多关于他们的信息(有太多此处插入):

http://dev.mysql.com/doc/refman/5.0/en/create-table.html


3
投票

我没那么熟悉MySQL的,但一般的多列索引是在指数中,单凭该列的索引的第一列同样有用。的多列索引变为用于查询针对单个列中的进一步的柱显示到索引不太有用。

这使得,如果你认为多列索引的层次一定意义。在该指数中的第一列是层次结构的根,所以寻找它仅仅是一个扫描即第一层次的问题。然而,为了扫描第二列,数据库来查找树的第一列中找到的每个独特的价值。这可够昂贵,大多数优化不会打扰深人地观察到一个多列索引,而是选择全表扫描。

例如,如果你有一个表,如下所示:

Col1 |Col2 |Col3
----------------
   A |   1 |   Z
   A |   2 |   Y
   A |   2 |   X
   B |   1 |   Z
   B |   2 |   X

假设您有三个列的索引,从而,树会是这个样子:

A
+-1
  +-Z
+-2
  +-X
  +-Y
B
+-1
  +-Z
+-2
  +-X

寻找Col1中=“A”很简单:你只需要看看2个有序值。但是,要解决COL3 =“X”,你必须考虑所有的4个大水桶的值,其中每个单独订购的。


2
投票

有综合指数和复合主密钥之间的差别。如果您已经定义了一个综合指数像下面

INDEX idx(invoice,item)  

如果你基于item查询索引不会工作,你需要添加一个单独的索引

INDEX itemidx(item)  

但是,如果你已经定义了一个复合主键下面一样

PRIMARY KEY(invoice, item)  

如果查询基于item并且不需要单独的索引的索引会的工作。

工作示例:

mysql>create table test ( col1 int(20), col2 int(20) ) primary key(col1,col2);
mysql>explain select * from test where col2 = 1;
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
|  1 | SIMPLE      | test  | index | NULL          | PRIMARY | 8       | NULL |   10 | Using where; Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+

0
投票

MySQL的自动创建复合主键索引。根据您的查询,您可能在复合键创建单独的列单独的索引。

如果你正在使用MySQL工作台,您可以手动右键单击模式,然后单击编辑上看到有关该表的一切

© www.soinside.com 2019 - 2024. All rights reserved.