这个查询应该使用什么mysql索引?
可能的键:项目标题、项目所有者、项目类型 关键字:您使用的项目 (通过使用explain命令获取这些信息)这个查询应该使用什么mysql索引?,mysql,linux,indexing,key,Mysql,Linux,Indexing,Key,可能的键:项目标题、项目所有者、项目类型 关键字:您使用的项目 (通过使用explain命令获取这些信息) 查询大约需要1.8秒,表中有超过百万条记录。我不知道如何为此查询编制索引,而且我无法控制源代码,因此无法修改查询。您可以对“标题”进行全文索引,这将显著增加查询时间 SELECT * FROM items WHERE caption LIKE 'name%' AND type = 'private' OR owner LIKE 'name%' type = 'private' ORDER
查询大约需要1.8秒,表中有超过百万条记录。我不知道如何为此查询编制索引,而且我无法控制源代码,因此无法修改查询。您可以对“标题”进行全文索引,这将显著增加查询时间
SELECT * FROM items WHERE caption LIKE 'name%' AND type = 'private' OR owner LIKE 'name%' type = 'private' ORDER BY uses DESC LIMIT 40;
Mysql V5.6及以上版本支持innodb中的全文搜索。
您需要先进行查询,看看它是如何工作的。如果我们不知道查询是如何执行的以及表的结构,我们将无法帮助您。也就是说,@chheplo说你可以在文本搜索中添加索引
ALTER TABLE items ADD FULLTEXT(caption,owner);
但是这取决于你的数据库设计,如果你使用的是Mysql 5.6,而你的引擎是Innodb,它不会工作,你需要engine=MyISAM,才能创建文本索引,你还需要执行解释,看看select是否也在使用它。但是我认为如果你避免“喜欢”,它会更快
关于由于您在select*上已经有了,所以您不能真正做覆盖索引,但您可以在(标题,类型)和(所有者,类型)上做一对复合索引 这将减少内部点查找 我认为您不需要全文搜索,因为您正在与您的同类值进行比较的值不是以通配符(%)开头的。与不以%开头的字符串相比,可以使用传统的快速b树索引。如果在“%name”中的类似项的开头有一个%,则不会是这种情况 此外,不要忘记搜索的条件是: 标题如“name%”和类型=“private” 或 所有者,如“name%”和类型=“private”
因此,如果caption子句失败,并且它尝试按所有者和类型进行查找,“ADD FULLTEXT(caption,owner)”不会有多大帮助。像'name%'这样的
和type='private'
Oops之间缺少的运算符是什么。它是和。从标题如“name%”和类型为“private”或所有者如“name%”和类型为“private”的项目中选择*ORDER BY使用DESC LIMIT 40;我正在使用innodb,所以我认为这是不可能的。对不起,我忘了提一下。实际上,在新版mysql中,innodb数据库支持全文搜索。因为我也没有意识到,OP无法修改查询,所以全文将不起任何作用。谢谢。现在速度快多了(花了0.031秒),我注意到现在查询中出现了更多问题。当出现类似SELECT*这样的查询时,从标题为“\u name\u%”且类型为“private”或所有者为“\u name\u%”且类型为“private”的条目中按顺序使用DESC LIMIT 40代码>它没有使用任何索引。只是因为名字在下划线之间。为什么会发生这种情况?有没有办法解决这个问题?@user1563934运行show create table
并将结果添加到帖子中,这样我就可以看到您的表结构。下划线不应影响任何内容,除非在其前面加“%”。
ALTER TABLE items ADD FULLTEXT(caption,owner);
ALTER TABLE items ADD INDEX (caption, type);
ALTER TABLE items ADD INDEX (owner, type);