我应该对此查询使用哪些mysql索引?

时间:2012-07-30 19:33:11

标签: mysql linux indexing key

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 (通过使用explain命令获得这些)

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

3 个答案:

答案 0 :(得分:2)

您可以对“标题”进行全文索引,这会显着增加查询时间。

ALTER TABLE items ADD FULLTEXT(caption,owner);

Mysql v 5.6及以上版本支持innodb中的全文搜索。 https://blogs.oracle.com/MySQL/entry/full_text_search_with_innodb

答案 1 :(得分:1)

您需要首先进行explain查询,看看它是如何工作的。如果我们不知道查询是如何执行的以及表的结构,我们无法帮助您。 I.E,@ chheplo说您可以在文本搜索中添加索引

ALTER TABLE items ADD FULLTEXT(caption,owner);

但这将取决于您的数据库设计,如果您使用的是Mysql 5.6-并且您的引擎是Innodb它不会工作,您将需要engine = MyISAM,以便能够创建文本索引,您还需要执行解释看是否也使用它。但是我想如果你避免“喜欢”它会更快,Performance of like '%Query%' vs full text search CONTAINS query

此致

答案 2 :(得分:1)

由于你有select *,你不能真正做覆盖索引,但你可以在(标题,类型)和(所有者,类型)上做一对复合索引。

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

这应该减少内部点查找。

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

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

  

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

OR

  

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

因此,如果caption子句失败并且它尝试按所有者和类型进行查找,那么“ADD FULLTEXT(标题,所有者)”将无济于事。