Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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_Group By - Fatal编程技术网

我如何让这个MySQL选择+;按查询分组是否更有效?

我如何让这个MySQL选择+;按查询分组是否更有效?,mysql,group-by,Mysql,Group By,我有一个相当受欢迎的网站,现在流量很大,我的网络主机告诉我,下面的查询运行起来需要2秒钟。我的MySQL技能不是很好,所以我肯定我做错了什么,但我不确定能做些什么来提高它 为简单起见,假设live_blueprints是一个包含四个字段的表: 已解决[tinyint(1)] levelSlug[varchar(128)] 解决方案[varchar(255)] trackCount[媒体(7)] 我意识到使用字符串(levelSlug)而不是int(id)可能是个坏主意,所以这是我想要解决的问

我有一个相当受欢迎的网站,现在流量很大,我的网络主机告诉我,下面的查询运行起来需要2秒钟。我的MySQL技能不是很好,所以我肯定我做错了什么,但我不确定能做些什么来提高它

为简单起见,假设live_blueprints是一个包含四个字段的表:

  • 已解决[tinyint(1)]
  • levelSlug[varchar(128)]
  • 解决方案[varchar(255)]
  • trackCount[媒体(7)]
我意识到使用字符串(levelSlug)而不是int(id)可能是个坏主意,所以这是我想要解决的问题之一。基本上,我试图用这个查询来抓取具有唯一解决方案字符串的前49个蓝图。live_blueprints表有大约550k行,我认为这是问题的主要原因。我的理解是,按照写这封信的方式,它会检查所有550k行,然后将它们分组,然后切掉最上面的49行给我。。。我只是想知道是否有一种方法,我可以做到这一点,而不必做这么多的工作的行。。。甚至可以创建第二个表,其中只包含“独特”的解决方案

不管怎样,现在的问题是:

SELECT * 
  FROM live_blueprints
 WHERE levelSlug = 'someLevelSlug' 
    && isSolved = 1 
GROUP BY solution 
ORDER BY trackCount ASC 
   LIMIT 49
感谢您提供的任何帮助或见解

好的,来回答一些问题:

表中唯一的索引是id和levelSlug。首先,我将在解决方案上添加一个索引

我做了解释,所以我想这就是你要找的,levelID是levelSlug的索引

id > 1
select_type > SIMPLE
table > live_blueprints
type > ref
possible_keys > levelID
key > levelID
key_len > 386
ref > const
rows > 4407
Extra > Using where; Using temporary; Using filesort

你的桌子上有什么索引

因为,在
解决方案上有一个索引,solutionCoolness
(按此顺序)在这里应该会有所帮助

对于where子句,您甚至可以使用列
levelSlug、isSolved、solution、solutionCoolness
的索引,以使其更快一些


无论哪种方式,我们都需要知道您有哪些索引,查看查询的
解释
会有帮助。

添加另一列怎么样,我们称之为排名,它将仅供您使用。 添加新解决方案时(如果已存在),请将此列设为零,否则请插入1或类似于轨迹计数的其他内容。
通过这种方式,您可以通过排名不为0的trackcount来删除该组

好的,我已经在原来的帖子中添加了这些内容,我将所有属性重命名为真实属性。。。我最初简化了字段名以简化事情,但我认为从长远来看,这只会使事情变得更复杂。。。例如,solutionCoolness现在是trackCount。@Matt Rix:不要试图在一列上添加索引,而是在所有列上一起添加索引。使用多个索引比使用一个包含多个列的索引慢得多。啊,好的,那么在这种情况下,我希望所有四列都有一个索引?或者只是简单的解决方案?呸,对不起,另一个问题。我到处找了,但似乎找不到答案。我使用的是phpMyAdmin,当我在多个字段上创建索引时,我必须提供索引中每个字段的大小。那么对于一个中等尺寸的(7),尺寸会是7吗?或者,这个大小属性是完全不同的吗。很抱歉,如果这些问题是超基本的。@马特·里克斯:您可以在所有四列上添加索引。但是我建议您阅读一些关于索引的内容,以便了解发生的情况:)大小对于Mediumnits是可选的,这意味着减少索引大小,因为索引可能会占用大量空间。您可以添加以下结果:显示live\u蓝图中的索引;所以我们可以检查基数-谢谢。levelID索引的基数是2522,主id的基数是567576。我似乎无法创建包含多个字段的索引,我不断收到错误,如“1071-指定的键太长;最大键长度为1000字节”或“1089-不正确的前缀键;使用的键部分不是字符串,使用的长度比键部分长,或存储引擎不支持唯一的前缀键”。我想我得研究一下指数。