gpt4 book ai didi

python - mysql 表有很多记录和新索引仍然很慢

转载 作者:行者123 更新时间:2023-11-29 18:35:08 26 4
gpt4 key购买 nike

我有下表,其中包含略少于 600,000 条记录:

CREATE TABLE `organization` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`company_name` varchar(255) DEFAULT NULL,
`uuid` varchar(255) DEFAULT NULL,
`created_at` varchar(255) DEFAULT NULL,
`updated_at` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `org_company_name_7467253` (`company_name`)
) ENGINE=InnoDB AUTO_INCREMENT=589816 DEFAULT CHARSET=utf8mb4;

该表运行缓慢,因此我在 company_name 上创建了一个索引:

CREATE INDEX `org_company_name_7467253` ON `organization` (`company_name`);

我正在执行如下几个查询,每个查询大约需要 30 秒:

for e in Entity.objects.all(): #around 2000 records - select * from entities
if Organization.objects.filter(company_name__icontains=e.name): #600,000 records - select * from organizations where company_name = entity.name
print 'contains organization'

我可以做些什么来加快速度吗?

最佳答案

执行相同的查询 2000 次需要时间。所以 30000 毫秒并不算多,对于查询来说只是 15 毫秒。

因此,您要么使用多线程来同时向数据库发送多个请求,就像我在这里所做的那样:

https://codereview.stackexchange.com/a/155263/95510

或者在数据库中执行 JOIN 以在单个查询中获得相同的结果。

不知道 DJANGO 是如何工作的,但我的猜测是 Entity.objects.all 代表数据库中的一个表。

所以类似:

SELECT E.*, O.*
FROM `Entity.objects.all` E -- 2000 records just make sure also have index on name
LEFT JOIN `organization` O -- 600,000 records
ON E.name = O.company_name
WHERE O.company_name IS NOT NULL

关于python - mysql 表有很多记录和新索引仍然很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45377456/

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