簡體   English   中英

MySQL:沒有主鍵的表(索引,外鍵)優化

[英]MySQL: optimization of table (indexing, foreign key) with no primary keys

每個成員有0個或更多訂單。 每個訂單至少包含1個項目。 memberid-varchar,而不是整數-沒關系(請不要說那不是很好,我無法更改)。 因此,thera 3個表:members,orders和order_items。 訂單和order_items如下:

CREATE TABLE `orders` (
`orderid` INT(11)  UNSIGNED NOT NULL AUTO_INCREMENT,
`memberid` VARCHAR( 20 ),
`Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`info` VARCHAR( 3200 ) NULL ,
PRIMARY KEY (orderid) ,
FOREIGN KEY (memberid) REFERENCES members(memberid)
) ENGINE = InnoDB;


CREATE TABLE `order_items` (
`orderid` INT(11)  UNSIGNED NOT NULL,
`item_number_in_cart` tinyint(1) NOT NULL , --- 5 items in cart= 5 rows
`price` DECIMAL (6,2) NOT NULL,
FOREIGN KEY (orderid) REFERENCES orders(orderid)
) ENGINE = InnoDB;

因此,order_items表如下所示:

訂單編號-item_number_in_cart-價格:

...

1000456-1-24.99

1000456-2-39.99

1000456-3-4.99

1000456-4-17.97

1000457-1-20.00

1000458-1-99.99

1000459-1-2.99

1000459-2-69.99

1000460-1-4.99

...

如您所見, order_items表沒有主鍵(而且我認為沒有必要為此表創建auto_increment id,因為一旦我們要提取數據,我們就始終將其提取為WHERE orderid='1000456' order by item_number_in_card asc -整個塊,id對查詢沒有幫助)。 一旦將數據插入order_items中,它就不會被更新,只是被選擇。

問題是:

  • 我認為將索引放在item_number_in_cart上是個好主意。 有人可以確認嗎?
  • 我還有什么其他與order_items有關的事情可以提高性能,或者看起來還不錯嗎? 我可能會錯過一些東西,因為我是新手。

先感謝您。

item_number_in_cart上的item_number_in_cart將不會使用。 這是一個很小的int,不夠有選擇性,並且一旦您有2條記錄,引擎甚至都不會考慮。 您可以將其作為第二列添加到orderid上的現有索引中(由於您在orderid上創建了FK約束,因此mysql會自動在該字段上添加索引)。
您說order_items中的數據從未更新過,但我認為可以刪除; 在沒有主鍵的情況下這樣做將是有問題的。

好吧,無論如何我都會擁有一個autoinc,因為我非常相信代理鍵,但是正如alex07所建議的那樣,索引,甚至是orderid的主鍵,item_number_in_cart應該都可以解決。 請注意,item_number的順序將使用兩次通過排序(獲取數據,然后按數字順序對其進行排序),因此索引/鍵會直接將其切掉,因此即使使用代理鍵,您也希望該索引。

主鍵可以跨越多列。 您不能使用列的PRIMARY屬性來執行此操作,但是可以定義具有多個列的單獨的主鍵:

CREATE TABLE `order_items` (
    `orderid` INT(11)  UNSIGNED NOT NULL,
    `item_number_in_cart` tinyint(1) NOT NULL , --- 5 items in cart= 5 rows
    `price` DECIMAL (6,2) NOT NULL,
    PRIMARY KEY (orderid, item_number_in_cart),
    FOREIGN KEY (orderid) REFERENCES orders(orderid)
) ENGINE = InnoDB;

而且,主鍵只是一個唯一鍵,其中每一列的名稱都不為空。 您可以在不可為空的列上創建自己的唯一鍵,以獲得相同的效果。

通過為item_number_in_cart索引,您不太可能獲得很大的性能提升; 由於給定訂單的訂單項數量會減少,因此按item_number_in_cart排序不會占用太多時間或內存。 但是,將列包含在主鍵中將有助於數據一致性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM