Mysql覆盖索引优化
表格(InnoDB):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
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列隐式添加到键。