具有许多记录和新索引的mysql表仍然很慢

时间:2017-07-28 15:39:02

标签: python mysql django

我的下表有少于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'

我有什么办法可以加快速度吗?

2 个答案:

答案 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秒内完成。