gpt4 book ai didi

MySQL select 太大(连接三个表)

转载 作者:行者123 更新时间:2023-11-29 08:03:14 28 4
gpt4 key购买 nike

我有一个查询,我正在选择一个大型数据集,并且由于连接表的一对多关系而花费了非常多的时间。我有三个表——简化后如下:

客户

| customers | CREATE TABLE `customers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(128) NOT NULL DEFAULT '',
`username` varchar(128) NOT NULL DEFAULT '',
`usertype` char(1) NOT NULL DEFAULT '',
`password` varchar(255) NOT NULL DEFAULT '',
`membershipid` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `membershipid` (`membershipid`)
) ENGINE=MyISAM AUTO_INCREMENT=980 DEFAULT CHARSET=latin1 |

成员(member)资格

| memberships | CREATE TABLE `memberships` (
`membershipid` int(11) NOT NULL AUTO_INCREMENT,
`membership` varchar(255) NOT NULL DEFAULT '',
`flag` char(2) NOT NULL DEFAULT '',
PRIMARY KEY (`membershipid`),
) ENGINE=MyISAM AUTO_INCREMENT=316 DEFAULT CHARSET=latin1 |

成员(member)契约(Contract)

| membership_contracts | CREATE TABLE `membership_contracts` (
`bond_id` int(11) NOT NULL AUTO_INCREMENT,
`membership_id` int(11) DEFAULT NULL,
`contract_id` int(11) NOT NULL,
PRIMARY KEY (`bond_id`),
UNIQUE KEY `membership_id` (`membership_id`,`contract_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1623 DEFAULT CHARSET=utf8 |

契约(Contract)项目

| contract_items | CREATE TABLE `contract_items` (
`contract_id` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
`price` decimal(12,2) DEFAULT NULL,
`start` int(11) DEFAULT NULL,
`end` int(11) DEFAULT NULL,
`contract_item_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`contract_item_id`)
) ENGINE=MyISAM AUTO_INCREMENT=27398 DEFAULT CHARSET=utf8 |

成员(member)与契约(Contract)、契约(Contract)与契约(Contract)项之间存在一对多的关系。

我当前的查询是:

SELECT customers.username, contract_items.contract_id, so_on_and_so_forth
FROM customers, memberships, membership_contracts, contract_items
WHERE customers.membershipid=memberships.membershipid
AND memberships.`membershipid=membership_contracts.membership_id
AND membership_contracts.contract_id=contract_items.contract_id
AND contract_items.item_id=user.item_id

因此,我有一个小型数据集(用户和项目),增加了 600,000 行(每个成员(member)资格大约有 25 个契约(Contract),每个契约(Contract)可以有超过 1000 个项目),仅选择用户在其成员(member)资格上拥有的契约(Contract)上的项目.

有没有更快的方法来做到这一点?我是否使用了不应该使用的连接?我在membership_contracts上有一个唯一的id索引,所以至少这是最小的。 |

| id | select_type | table                | type   | possible_keys            | key           | key_len | ref                                                                                             | rows  | Extra                           |
+----+-------------+----------------------+--------+--------------------------+---------------+---------+-------------------------------------------------------------------------------------------------+-------+---------------------------------+
| 1 | SIMPLE | contract_items | ALL | NULL | NULL | NULL | NULL | 24691 | Using temporary; Using filesort |
| 1 | SIMPLE | order_details | ref | orderid,productid | productid | 4 | database123456789.contract_items.product_id | 2 | |
| 1 | SIMPLE | orders | eq_ref | PRIMARY,odsp,ospd,userid | PRIMARY | 4 | database123456789.order_details.orderid | 1 | |
| 1 | SIMPLE | customers | eq_ref | PRIMARY,membershipid | PRIMARY | 4 | database123456789.orders.userid | 1 | |
| 1 | SIMPLE | membership_contracts | ref | membership_id | membership_id | 9 | database123456789.customers.membershipid,database123456789.contract_items.contract_id | 12 | Using where; Using index |
| 1 | SIMPLE | memberships | eq_ref | PRIMARY | PRIMARY | 4 | database123456789.membership_contracts.membership_id | 1 | Using where |

最佳答案

“contract_items”表需要在contract_id字段上建立索引。

关于MySQL select 太大(连接三个表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23251744/

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