2012-03-13 66 views
0

表(InnoDB的):Mysql的覆蓋索引優化

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)

和我創建的UNIQUE(category_id,product_id) SQL查詢的KEY 2

我想知道對不對?

其他優化可能嗎?

非常感謝

+1

'category_id'可能是一個通常的btree索引('category_id'),沒有額外的唯一約束,PK列隱式添加到鍵。 – newtover 2012-03-13 16:24:54

回答

2

如果使用INNODB引擎,也沒有必要對第二綜合指數(上category_id,product_id)。只需在category_id上索引就足夠了,因爲所有二級索引都保留主鍵的副本

1

如果您已經有主鍵(如果一組列是主鍵,那麼這個集合也是唯一的)。

您可以將字段分別設置爲唯一,但前提是您確定category_id具有單個product_id且product_id具有單個category_id。從名字我推斷,一個類別可能有更多的產品和產品可能是更多類別的一部分。如果是這種情況,你不應該創建獨特的限制。

優化:如果您沒有太多的類別或產品,您應該將這些字段定義爲較小的尺寸(也許是int(5))。