【问题标题】:mysql pagination with left join and LIKE -> super slow带有左连接和LIKE的mysql分页->超级慢
【发布时间】:2013-11-21 01:03:33
【问题描述】:

所以 - 我有 2 张桌子:

entries表:

id - Primary key
meta_keys VARCHAR 20
meta_desc VARCHAR 20
..some other unimportant columns...

headwords表:

id -  Primary key
fk_entries_id - foreign key refers to entries(id)
headword_text VARCHAR(200)
..some other unimportant columns...

所以条目可能有多个词条 - 对。所以我只是想对词条中包含特定单词的条目进行分页。我想出的唯一查询需要 LEFT JOIN 然后 LIKE 并且有点慢。

SELECT entries.*, GROUP_CONCAT(DISTINCT headwords.headword_text SEPARATOR ' ') AS hw 
FROM entries 
LEFT JOIN headwords ON (entries.id = headwords.fk_entries_id) 
GROUP BY entries.id
HAVING hw LIKE '%dog%' 
LIMIT 20,20;

寻求建议以加快此方法。

EDIT> WAIT - 这是一个错误的查询吗?:

SELECT entries.id, GROUP_CONCAT(DISTINCT headwords.headword_text SEPARATOR ' ') AS hw 
FROM entries 
LEFT JOIN headwords 
ON (entries.id = headwords.fk_entries_id) 
WHERE headwords.headword_text LIKE 'dog%' 
GROUP BY entries.id;

【问题讨论】:

  • 听起来像是一个真正的全文搜索引擎的绝佳案例。请参阅slideshare.net/billkarwin/…(作为评论发布,因为它并不能真正回答您的问题。而是避开它:)
  • 嘿巴里!我在前端使用 sphinx,但我不想在后端使用它,因为它在单独的服务器上,然后除了 CRUD 之外,我还必须更新 RT 索引。
  • 好吧,即使使用内置全文搜索支持的 mysqls 也可能会有所帮助。
  • 对于您刚刚添加的最后一个查询,建议在查询中添加 EXPLAIN 的输出。
  • 全文搜索支持 > 它只适用于 mysql 5.6,我在 ubuntu 12.04 服务器上使用 5.5:)

标签: mysql sql left-join


【解决方案1】:

您应该使用 IN 比较来避免您正在执行的所有字符串连接和搜索:

select e.*
from entries e
where e.id IN (
   select distinct fk_entries_id
   from headwords
   where headword_text like '%dog%'
)
order by e.id
limit 20,20;

此外,如果您只匹配单词的 START,则可以通过将 '%dog%' 替换为 'dog%' 来进一步提高它的性能。这将进一步提高性能,因为您不再需要考虑在每个标题词前面添加的文本。

【讨论】:

  • 这在一定程度上有所改善:25 行集合(0.58 秒)vs 25 行集合(0.38 秒)(单% 模式) - 仍然看起来有点慢,因为这是未加载的开发服务器。条目和词条表中都有 ~40000 行
  • 等等——我可能只在 ON 子句之后使用 WHERE——然后这会非常快,除非我遗漏了什么。
  • 还有一个关于headword_text的索引的问题。你呢?
  • 是的 - 我有一个索引!:)
  • 抱歉长周末没有互联网 - 0.58 到 0.38 似乎是相当不错的改进(约 33% 改进)。如果您已经索引了它,那么缺少全文搜索,我认为您不会更快地获得它。祝你好运!
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
相关资源
最近更新 更多