【问题标题】:mysql full text search with left join is slow带有左连接的mysql全文搜索很慢
【发布时间】:2017-11-10 17:38:44
【问题描述】:

我有 2 个表格:带有单词示例的单词。大约有 70k 个单词和大约 100 万个示例。我试图通过搜索和分页结果添加管理员,但遇到查询需要 6-7 秒才能产生结果。
我做错了吗?

这是架构:

```
CREATE TABLE IF NOT EXISTS words (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    word VARCHAR(191) DEFAULT NULL,
    fl VARCHAR(191) DEFAULT NULL,
    UNIQUE KEY (word, fl),
    FULLTEXT (word)
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;


CREATE TABLE IF NOT EXISTS examples (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    fk_words_id BIGINT UNSIGNED,
    src VARCHAR(50) DEFAULT NULL,
    example VARCHAR(400) DEFAULT NULL,
    cite_author VARCHAR(400) DEFAULT NULL,
    cite_publication VARCHAR(400) DEFAULT NULL,
    cite_title VARCHAR(400) DEFAULT NULL,
    FULLTEXT (example,cite_author,cite_publication),
    PRIMARY KEY (id),
    FOREIGN KEY (fk_words_id) REFERENCES words (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
```

我对分页结果的查询如下所示:

SELECT DISTINCT 
a.id,
a.word,
a.fl,
a.updated
FROM words AS a
LEFT JOIN examples AS b
ON a.id = b.fk_words_id
WHERE (a.word = :search_string OR MATCH(b.example,b.cite_author,b.cite_publication) AGAINST(+'some word' IN BOOLEAN MODE))
ORDER BY id asc
LIMIT 0,20;

有什么方法可以提高性能吗?

【问题讨论】:

  • 191有什么意义?这是一个非常奇怪的任意列长度。
  • @tadman utf8 4 字节字符的最大数量:stackoverflow.com/questions/20123824/…
  • MySQL 5.7 没有这个限制,所以如果你遇到问题,值得升级。
  • @tadman 啊。很高兴知道。我在 5.7 上,这很好:)
  • 先测试一下,但我想你会发现 5.7 从旧版本中删除了很多真正特殊的限制。最后! InnoDB 引擎的重大改进。

标签: mysql full-text-search


【解决方案1】:

我建议如下。对一列执行不同的 b 应该比执行左连接然后对 4 列执行不同的操作更快。

SELECT
      a.id
    , a.word
    , a.fl
    , a.updated
FROM words AS a
LEFT JOIN (
      SELECT DISTINCT fk_words_id FROM examples
      WHERE MATCH(b.example,b.cite_author,b.cite_publication) AGAINST(+'some word' IN BOOLEAN MODE))
      ) b ON a.id = b.fk_words_id
WHERE a.word = :search_string
ORDER BY
      id ASC
LIMIT 0,20;

【讨论】:

  • 您的问题现在解决了吗?你对这个答案还有疑问吗?要接受答案“Click the Tick”了解更多信息,请参阅help/accepting
猜你喜欢
  • 2015-11-02
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多