Dav*_*ngs 31 mysql sql indexing primary-key
没有找到这个特定的菜鸟问题的答案.如果我错过了,我道歉.
在MySQL数据库中,我有一个包含以下主键的表
PRIMARY KEY id(发票,项目)
在我的应用程序中,我还经常选择"项目"本身,而不是经常选择"发票".我假设我会从这些列的索引中受益.
当我定义以下内容时,MySQL不会抱怨:
INDEX(发票),INDEX(项目),PRIMARY KEY id(发票,项目)
但我没有看到任何证据(使用DESCRIBE - 我知道如何查看的唯一方法)已经为这两列建立了单独的索引.
所以问题是,构成主键的列是否会自动单独索引?另外,有没有比DESCRIBE更好的方法来探索我的桌子的结构?
Cha*_*ana 48
我并不熟悉mySql上的索引内部,但是我熟悉的两个数据库供应商产品(MsSQL,Oracle)索引是平衡树结构,其节点被组织为列的有序元组. index定义于(在序列中定义)
因此,除非mySql以非常不同的方式(可能不是)执行,否则任何复合索引(在多个列上)都可以被任何需要按索引中的列子集进行过滤或排序的查询使用,只要列列表是兼容的,即,如果列与完整索引中的列的顺序列表相同,则列是完整索引列集的有序子集,它从实际索引序列的开头开始,没有差距,除了最后......
换句话说,这意味着如果在(a,b,c,d)上有索引,则对(a),(a,b)或(a,b,c)进行过滤的查询也可以使用索引,但是需要在(b),或(c)或(b,c)上过滤的查询将无法使用索引...
因此,在您的情况下,如果您经常需要单独对列项进行过滤或排序,则需要在该列上添加另一个索引...
Geo*_*eel 15
我个人使用phpMyAdmin来查看和编辑MySQL数据库的结构.它是一个Web应用程序,但它在本地Web服务器上运行良好(我在我的机器上运行apache实例和phpPgAdmin).
至于复合键(invoice, item),它就像一个索引(invoice, item)和for invoice.如果你想索引,item你必须自己添加索引.您的PK将按多个记录排序invoice,然后在item哪里排序invoice相同.虽然复合PK中的顺序与唯一性实施无关,但它对访问很重要.
在你的桌子上我会使用:
PRIMARY KEY id (invoice, item), INDEX (item)
Run Code Online (Sandbox Code Playgroud)
我对 MySQL 不太熟悉,但通常多列索引在索引中的第一列上与单独在该列上的索引同样有用。列出现在索引中的次数越多,多列索引对于针对单列进行查询的用处就越小。
如果您将多列索引视为层次结构,这是有道理的。索引中的第一列是层次结构的根,因此搜索它只需扫描第一层即可。但是,为了扫描第二列,数据库必须在树中查找第一列中找到的每个唯一值。这可能成本高昂,以至于大多数优化器不会费心深入研究多列索引,而是选择全表扫描。
例如,如果您有一个如下表:
Col1 |Col2 |Col3
----------------
A | 1 | Z
A | 2 | Y
A | 2 | X
B | 1 | Z
B | 2 | X
Run Code Online (Sandbox Code Playgroud)
假设您在所有三列上都有索引,按顺序,树将如下所示:
A
+-1
+-Z
+-2
+-X
+-Y
B
+-1
+-Z
+-2
+-X
Run Code Online (Sandbox Code Playgroud)
查找 Col1='A' 很简单:您只需查看 2 个有序值。但是,要解析 col3='X',您必须查看 4 个较大存储桶中的所有值,每个存储桶都是单独排序的。
复合索引和复合主键是有区别的。如果您定义了如下复合索引
INDEX idx(invoice,item)
Run Code Online (Sandbox Code Playgroud)
如果您基于查询item并且需要添加单独的索引, 则该索引将不起作用
INDEX itemidx(item)
Run Code Online (Sandbox Code Playgroud)
但是,如果您定义了如下复合主键
PRIMARY KEY(invoice, item)
Run Code Online (Sandbox Code Playgroud)
如果您基于查询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 |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
Run Code Online (Sandbox Code Playgroud)