gpt4 book ai didi

mysql - 在连接时查询大型数据集(超过 15 万行)

转载 作者:可可西里 更新时间:2023-11-01 08:39:39 25 4
gpt4 key购买 nike

我正在尝试连接两个表,productsproducts_marketsproducts 少于一百万条记录,而 product_markets 接近 2000 万条记录。数据已更改,因此在模式创建表中可能存在一两个错字:

CREATE TABLE `products_markets` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(10) unsigned NOT NULL,
`country_code_id` int(10) unsigned NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_index` (`product_id`,`country_code_id`)
) ENGINE=InnoDB AUTO_INCREMENT=21052102 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `products` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`manufacturer_id` int(10) unsigned NOT NULL,
`department_id` int(10) unsigned NOT NULL,
`code` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
`popularity` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`value` bigint(20) unsigned NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `products_code_unique` (`code`),
KEY `products_department_id_foreign` (`department_id`),
KEY `products_manufacturer_id_foreign` (`manufacturer_id`),
CONSTRAINT `products_department_id_foreign`
FOREIGN KEY (`department_id`) REFERENCES `departments` (`id`),
CONSTRAINT `products_manufacturer_id_foreign`
FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturers` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=731563 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

我试图返回特定国家/地区最流行产品的 50 条记录,我遇到了大约 50 秒的时间,这似乎比预期的要长。

我尝试了几个不同的查询但没有成功:

select  `products_markets`.`product_id`
from products_markets
left join
( SELECT products.id, products.popularity
from products
) p ON p.id = products_markets.product_id
where products_markets.country_code_id = 121
order by `popularity` desc, `p`.`id` asc
limit 50

select  `products`.*
from `products`
where products.id in (
SELECT product_id
from products_markets
where products_markets.country_code_id = 121
)
group by `products`.`name`, `products`.`manufacturer_id`
order by `popularity` desc, `products`.`id` asc
limit 50

这个查询的解释是:

id  select_type  table              type possible_keys key           key_len refs             rows              extra
1 PRIMARY products ALL PRIMARY NULL NULL NULL 623848 Using temporary; Using filesort
1 PRIMARY products_markets ref unique_index unique_index 4 main.products.id 14 Using where; Using index; FirstMatch(products)

我喜欢的一个选择是将 products_markets 拆分为每个国家/地区的单独表格以减少查询。我试过向服务器添加更多内存但没有成功。任何人都可以识别数据库设计/查询有什么明显的错误吗?

还有哪些其他选项可以使此查询成为当前 ~50 秒的一小部分?

最佳答案

去掉 products_markets 中的 id 并添加

PRIMARY KEY(country_code_id, product_id)

然后去掉 UNIQUE 键,除非其他查询需要它。

这将显着缩小该大表的磁盘占用空间,从而有可能加快所有涉及它的查询。

这将有助于 Hamaza 建议的重新制定。

关于mysql - 在连接时查询大型数据集(超过 15 万行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39128824/

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