【发布时间】: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 引擎的重大改进。