数据库版本 MySQL 5.1.41
如果下表结构,表t已经有联合主键,如果还要建立外键约束的话,我测试过,不添加索引的话,直接建立外键约束则会自动添加pid的索引,但uid不需要建立(联合主键中第一个字段)
那我还需要为uid添加索引吗??
BTW,查资料的时候看到
http://www.oschina.net/bbs/thread/9626
这链接里说5.5版本的如果没有添加索引的话速度会很慢/* 表结构 */
DROP TABLE IF EXISTS `t`;
CREATE TABLE IF NOT EXISTS `t` (
  `uid` INT(1) NOT NULL,
  `pid` INT(1) NOT NULL,
  `other` VARCHAR(10) NULL,
  PRIMARY KEY (`uid`, `pid`),
  KEY `uid`(`uid`),
  KEY `pid`(`pid`)
)ENGINE=InnoDB;DROP TABLE IF EXISTS `p`;
CREATE TABLE IF NOT EXISTS `p` (
  `id` INT(1) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(10) NOT NULL
)ENGINE=InnoDB;DROP TABLE IF EXISTS `u`;
CREATE TABLE IF NOT EXISTS `u` (
  `id` INT(1) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(10) NOT NULL
)ENGINE=InnoDB;ALTER TABLE `t`
ADD CONSTRAINT `t_ibkf_1` FOREIGN KEY (`pid`) REFERENCES `p` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `t_ibkf_2` FOREIGN KEY (`uid`) REFERENCES `u` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

解决方案 »

  1.   

    uid 不需要建立了.
    5.5 没有用过,不太清楚...
      

  2.   

    CREATE TABLE IF NOT EXISTS `t` (
      `uid` INT(1) NOT NULL,
      `pid` INT(1) NOT NULL,
      `other` VARCHAR(10) NULL,
      PRIMARY KEY (`uid`, `pid`),
      KEY `uid`(`uid`),
      KEY `pid`(`pid`)
    )ENGINE=InnoDB;
    这个KEY `uid`(`uid`)的索引没什么特别意义,完全可以使用PRIMARY KEY (`uid`, `pid`),替代。 唯一的情况下会使用KEY `uid`(`uid`)的是 select uid from t where uid=1
      

  3.   

    第一列不要再单独建,第二列可以单独建。
    PRIMARY KEY (`uid`, `pid`),相当于2个索引,KEY (`uid`),KEY (`uid`, `pid`),。因为MYSQL使用的是最左前缀索引方式。