Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个查询应该使用什么mysql索引?_Mysql_Linux_Indexing_Key - Fatal编程技术网

这个查询应该使用什么mysql索引?

这个查询应该使用什么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

可能的键:项目标题、项目所有者、项目类型 关键字:您使用的项目 (通过使用explain命令获取这些信息)


查询大约需要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);