Mysql覆盖索引优化

时间:2012-03-13 16:16:32

标签: mysql

表格(InnoDB的):

CREATE TABLE `product_category` (
  `product_id` int(11),
  `category_id` int(11),
  PRIMARY KEY (`product_id`,`category_id`),
  UNIQUE KEY `category_id` (`category_id`,`product_id`)
)

我需要在我的项目中运行以下SQL查询:

1. select `category_id` from `product_category` where `product_id`=?
2. select `product_id` from `product_category` where `category_id`=?

我为SQL查询1

创建PRIMARY KEY(product_id,category_id)

我为SQL查询2创建UNIQUE(category_id,product_id) KEY

我想知道对吗?

可能的其他任何优化?

非常感谢

2 个答案:

答案 0 :(得分:2)

如果您使用INNODB引擎,则不需要第二个复合索引(在category_id,product_id上)。仅在category_id上有一个索引就足够了,因为所有二级索引都保留了主键的副本

答案 1 :(得分:1)

如果您已经拥有主键,则不应为这些字段创建唯一约束(如果一组列是主键,则该集也是唯一的。)

您可以将字段分别设置为唯一,但前提是您确定category_id具有单个product_id且product_id具有单个category_id。从名称中我推断出一个类别可能包含更多产品,而产品可能是更多类别的一部分。如果是这种情况,则根本不应创建唯一约束。

优化:如果您没有这么多类别或产品,您应该将这些字段定义为更小的尺寸(可能是int(5))。