【发布时间】:2011-10-07 08:29:49
【问题描述】:
当我执行以下查询时,我有几个表连接在一起:
SELECT article.year, authors.last_name, count(DISTINCT article.id) as count FROM
article LEFT JOIN authors ON article.id = authors.id WHERE authors.last_name =
'bloggs' GROUP BY article.year
由于某种原因,这需要 6 到 7 秒才能返回结果,考虑到它必须处理的行数相对较少,这对我来说似乎慢得令人难以置信。我在这里做错了吗?
如果我在查询上运行 EXPLAIN,我会得到以下信息:
select_type table type possible_keys key key_len ref rows extra
=====================================================================================
simple article all null null null null 762 using temporary; using filesort
simple authors all null null null null 5061 using where; using join buffer
两个表都是 InnoDB。我是从我的本地机器上运行的,它的规格相当低(windows xp,1 ghz,1gb ram),但即便如此,我认为这会更快。如果我将更多行加载到表中,它开始需要几分钟而不是几秒钟。
有什么想法吗?
下面的表结构:
Article:
field type null key default extra
=======================================================
id int yes null
year char(20) yes null
volume char(20) yes null
issue char(20) yes null
title text yes null
Authors:
field type null key default extra
=======================================================
id int yes null
last_name char(100) yes null
initials char(10) yes null
【问题讨论】:
-
你有
authors.last_name的索引吗?您对用于连接的列有索引吗?你有authors.last_name的索引吗?如果您根本没有索引,那么随着表大小的增长,它会越来越慢。 -
也发布你的表格结构。 (我的意思是
authors.last_name和article.year。) -
不,目前我在查询中使用的列上没有任何索引,这很好。我没有添加它们,因为在这个阶段它似乎是一个相当小的表来处理,但我会尝试在受影响的列上添加索引,看看它是否能解决任何问题......
-
您还应该考虑将
year设为INT而不是char(20)。它是 4 个字节(如果您将其设为SMALLINT,则为 2 个字节)而不是 20 个。更少的空间,更少的索引空间,没有人可以使用year='my gosh, 2012'添加一行。
标签: mysql performance left-join