哪个表在MYSQL中更快?

时间:2017-09-11 17:50:45

标签: mysql indexing

两张桌子:

CREATE TABLE `htmlcode_1` (
  `global_id` int(11) NOT NULL,
  `site_id` int(11) NOT NULL,
  PRIMARY KEY (`global_id`),
  KEY `k_site` (`site_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `htmlcode_2` (
  `global_id` int(11) NOT NULL,
  `site_id` int(11) NOT NULL,
  PRIMARY KEY (`site_id`,`global_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

选择哪一个应该更快?为什么?

'select * from table where site_id=%s'

3 个答案:

答案 0 :(得分:3)

对于SELECT查询,后一个表可能稍快一些,假设该表有一个非常重要的行数。

通过主键查询InnoDB时,查找是针对表的聚簇索引。

辅助键查找需要在索引中查找,然后显示主键值,然后用于按主键执行查找。所以这使用了两次查找。

答案 1 :(得分:0)

使用PRIMARY KEY的原因是允许快速访问 OR REFERENTIAL INTEGRITY(CONSTRAINT ... FOREIGN KEY ...

在第二个示例中,如果任何其他表引用了您的表,则没有正确的引用完整性密钥。在这种情况下,其他操作将非常缓慢。

在任何一种情况下,对于您的特定情况,速度的差异应该太小而且微不足道,但正确的设计将决定第一种方法。

答案 2 :(得分:0)

第一个表代表许多"全局"在每个"网站"。也就是说,"多对一"关系。但这是"错误"这样做的方式。相反,Globals表应该有一列site_id来表示与Sites表的这种关系。同时,htmlcode_1的存在是一种低效的浪费。

第二个表可能代表多对多"多对多" "网站"之间的关系和"全局"。如果这是您真正想要的,请参阅my tips。由于您可能会从全局变量到站点,因此需要另一个索引。