Mysql覆盖索引优化

Mysql覆盖索引优化,mysql,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 `prod

表格(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创建
主键(产品id、类别id)

我为SQL查询2创建
UNIQUE(category\u id,product\u id)

我想知道,对吗

还有其他可能的优化吗


非常感谢

如果您使用的是
INNODB
引擎,则不需要第二个复合索引(关于
类别id,产品id
)。只要在
category\u id
上有一个索引就足够了,因为所有的二级索引都保留一个主键的副本如果您使用的是
INNODB
引擎,就不需要第二个复合索引(在
category\u id,product\u id
上)。只要在
category\u id
上有一个索引就足够了,因为所有二级索引都保留一个主键的副本如果这些字段已经有主键,则不应该为它们创建唯一约束(如果一组列是主键,那么该组也是唯一的)

您可以单独将字段设置为唯一,但前提是您确保类别id具有单个产品id,并且产品id具有单个类别id。从名称中,我推断类别可能具有更多产品,并且产品可能属于更多类别。如果是这种情况,则根本不应创建唯一约束


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

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

您可以单独将字段设置为唯一,但前提是您确保类别id具有单个产品id,并且产品id具有单个类别id。从名称中,我推断类别可能具有更多产品,并且产品可能属于更多类别。如果是这种情况,则根本不应创建唯一约束


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

category\u id
可能是一个普通的btree索引(
category\u id
),没有额外的唯一约束,PK列隐式添加到键。
category\u id
可能是常用的btree索引(
category\u id
),如果没有其他唯一约束,则PK列隐式添加到键。