我应该用这个查询来使用哪些mysql索引?

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秒,表中有超过百万条logging。 我不知道如何使这个查询的索引,我没有控制源,所以我不能修改查询。

既然你已经选择了*,你不能真的做一个覆盖索引,但是你可以在(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'

因此,如果标题子句失败,那么“ADD FULLTEXT(标题,所有者)”将不会有多大帮助,并且会尝试按所有者和类型进行查找。

你可以在'caption'上做全文索引,这会大大增加查询时间。

 ALTER TABLE items ADD FULLTEXT(caption,owner); 

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

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

 ALTER TABLE items ADD FULLTEXT(caption,owner); 

但是这取决于你的数据库设计,如果你使用的是Mysql 5.6,而你的引擎是Innodb,它将不能工作,你需要engine = MyISAM,才能创建文本索引,同时你需要执行解释来看看如果选择也使用它。 不过,我认为如果你避免“LIKE”,它会更快, 像'%查询%'的性能与全文搜索CONTAINS查询

问候