2014-05-20 96 views
0

2代表我有两个MySQL表:"list""more"MySQL的加入基于文本字段

“列表”表有向上10万条。

“更多”表有超过50,000个结果。

来自这些表的数据不能组合。

问题是,我在这两个表中都有一个名为“short_title”的列。它们都是VARCHAR(255),并且会包含一个像“short-title-here”这样的字符串。

我用一个简单的查询,如:

SELECT L.title, M.more_info 
FROM `list` L, `more` M 
WHERE M.short_title = L.short_title 

由于在每个表这么多的成果,我需要基于“short_title”列这是一个文本字段中的匹配结果它使查询极其缓慢。

有关于在"list""short_title"列的索引,并在我的"more""short_title"列是唯一

有什么我可以做的到列(例如:使它们全文),这将使这些查询更快?

预先感谢您

**** ****更新

我已经改变了我的查询INNER JOIN两个表。

的解释查询的结果可以在这里找到:

Results of the Explain Query

+0

由于您正在比较列的相等性,我不认为您需要全文功能......只要确保在两个表的short_title列上都有一个索引即可。 – Frazz

+0

谢谢,但我在列表中的''short_title''列已经包含一个INDEX,并且''more''表中的''short_title''列被设置为UNIQUE - 如果我添加一个指数,phpMyAdmin提醒我,我不应该在同一列有两个INDEXes – user1298740

+0

你确定索引统计数据是否更新?如果不是,引擎可能无法正确使用您的索引。查询执行需要多长时间?你有解释计划来向我们展示吗?只是要检查正在使用的索引。另外...你是否尝试了INNER JOIN语法而不是旧的多元WHERE语法? – Frazz

回答

0

尝试索引short_title领域。

+0

“short_title”列已编入索引。在我的“list”表中,它们是INDEX,在我的“more”表中,它们是UNIQUE – user1298740

0

这是您的查询(使用明确的书面联接):

SELECT L.title, M.more_info 
FROM list L join 
    more M 
    on M.short_title = L.short_title; 

幽州short_title被存储为text。您可以通过在其上创建一个常规的索引:

create index more_short_title on more(short_title(255)); 

255是被索引的字节数。这应该加快查询速度。

此外,为了像short_title这样的名称,为什么不只是使用varchar()列而不是text

+0

谢谢你的回应,但我应该澄清一点。 我的“short_title”列是包含文本的文本字段。它们实际上是VARCHAR(255) – user1298740

+0

@ user1298740。 。 。然后建立没有'255'长度选项的索引。 –

+0

该指数已经存在,没有长度选项 – user1298740