我的下表有少于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'
我有什么办法可以加快速度吗?
答案 0 :(得分:0)
执行相同的查询2000次需要时间。所以30000毫秒并不是15毫秒的查询。
所以你要么多线程同时向db发送多个请求,就像我在这里做的那样:
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
答案 1 :(得分:0)
问题在于我正在做“喜欢”而不是“等于”搜索。
select * from organization
where organization.name like '%my company%'
我把它改为:
select * from organization
where organization.name = 'my company'
查询在5秒内完成。