3
SELECT * FROM items WHERE caption LIKE 'name%' AND type = 'private' OR owner LIKE 'name%' type = 'private' ORDER BY uses DESC LIMIT 40;

可能的键:items_caption、items_owner、items_type 键:items_uses(通过使用说明命令获得这些)

执行该查询大约需要 1.8 秒,并且表中有超过百万条记录。我不知道如何为此查询创建索引,并且我无法控制源,因此我无法修改查询。

4

3 回答 3

2

You can do fulltext indexing on 'caption' and it will increase the query time significantly.

ALTER TABLE items ADD FULLTEXT(caption,owner);

Mysql v 5.6 and above support fulltext search in innodb. https://blogs.oracle.com/MySQL/entry/full_text_search_with_innodb

于 2012-07-30T19:35:18.143 回答
1

你需要先做一个解释查询,看看它是如何工作的。如果我们不知道查询是如何执行的以及您的表的结构,我们将无法帮助您。IE,@chheplo 说您可以在文本搜索中添加索引

ALTER TABLE items ADD FULLTEXT(caption,owner);

但这取决于您的数据库设计,如果您使用的是 Mysql 5.6- 并且您的引擎是 Innodb 它将无法工作,您需要 engine = MyISAM,以便能够创建文本索引,您还需要执行说明以查看如果选择也在使用它。但是我认为,如果您避免使用“LIKE”,它会更快,“%Query%”之类的性能与全文搜索包含查询

问候

于 2012-07-30T19:45:49.123 回答
1

由于您已经选择 *,因此您不能真正做一个覆盖索引,但您可以在 (caption,type) 和 (owner, type) 上做一对复合索引。

ALTER TABLE items ADD INDEX (caption, type);
ALTER TABLE items ADD INDEX (owner, type);

这应该减少内部点查找。

我认为您不需要全文搜索,因为您与 LIKE 比较的值不以通配符 (%) 开头。与不以 % 开头的字符串进行比较的点赞可以使用传统的快速 B 树索引。如果你在 LIKE 的开头有一个 % ,就像在 '%name' 中一样,情况就不是这样了。

另外,不要忘记您的搜索条件:

标题 LIKE 'name%' AND type = 'private'

或者

所有者 LIKE 'name%' AND type = 'private'

因此,如果标题子句失败并且它尝试按所有者和类型查找,“添加全文(标题,所有者)”将无济于事。

于 2012-07-30T19:46:10.317 回答