gpt4 book ai didi

MySQL:优化无主键的表(索引、外键)

转载 作者:行者123 更新时间:2023-11-29 06:13:07 26 4
gpt4 key购买 nike

每个成员(member)有 0 个或多个订单。每个订单至少包含 1 件商品。memberid - varchar,而不是整数 - 没关系(请不要提到这不是很好,我无法更改它)。因此,共有 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 表如下所示:

订单 ID - 购物车中的商品编号 - 价格:

...

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 - 整个 block ,id 对查询没有帮助)。一旦数据被插入到 order_items 中,它就不会被更新,而只是被选择。

问题是:

  • 我认为将索引放在购物车中的 item_number_in_cart 上是个好主意。有人可以证实一下吗?
  • 我还需要对 order_items 做些什么来提高性能,或者看起来不错吗?因为我是新手,所以我可能会错过一些东西。

提前谢谢你。

最佳答案

主键可以跨越多个列。您不能使用列的 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 排序不会占用太多时间或内存。但是,在主键中包含该列将有助于数据一致性。

关于MySQL:优化无主键的表(索引、外键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8130251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com