我需要本地化我的查询结果。要做到这一点,我有:
- 表
Show
,包含id
和其他一些信息; - 表
ShowName
与idShow
,name
,lang
(每个show有多个showName
,其中Show.id
=ShowName.idShow
)
我的查询是现在,并正常工作:
select Show.*,
(SELECT name FROM ShowName
WHERE Show.id=ShowName.idShow
ORDER BY FIELD(lang,'$userPreferredLanguage','en','it','es','fr','de','pt','da','he','pl','nl','hu','no','sl', 'fi','sv','tr','cs','hr', 'el','ru','zh','ja','ko')
LIMIT 0,1) as name,
from Show
现在,问题是:有没有一种方法可以稍微加快速度?查询大约需要3秒,其中2秒用于计算内部SELECT
。我尝试了INNER JOIN
,但我不知道如何省略第二个选择。PS:注意ShowName
可能没有所有的本地化,所以我需要使用FIELD
函数而不是简单的WHERE lang = '$userPreferredLanguage'
。
提前感谢!
你有ShowName(idShow)
的索引吗?
那会有帮助的。一个更好的索引是:ShowName(IdShow, name, lang)
,因为子查询中的所有列引用都可以被索引满足。
一旦你有了索引,执行显式连接也可能更快:
select Show.*,
(SELECT name
FROM ShowName join
(select 'en' as lang, 1 as priority union all
select 'it', 2 union all
. . .
) lp
on showname.lang = lp.lang
WHERE Show.id=ShowName.idShow
ORDER BY lp.priority
LIMIT 0, 1
) as name
from Show