我正在尝试从简单的MySQL查询中删除filesort。
该表的列<html>
<body>
<div class="r_flex_container">
<div class="r_flex_fixed_child">
<p> This is the fixed 'header' child of the flex container </p>
</div>
<div class="r_flex_expand_child">
<article>this child container expands to use all of the space given to it - but could be shared with other expanding childs in which case they would get equal space after the fixed container space is allocated.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
</article>
</div>
<div class="r_flex_fixed_child">
this is the fixed footer child of the flex container
asdfadsf
<p> another line</p>
</div>
</div>
</body>
</html>
为0或1,并且列active
是一个整数,并且没有连接。
我的选择语句如下:
season_average
我在SELECT
*
FROM `group` WHERE active=1
ORDER BY season_average DESC
,active
以及season_average
和(active, season_average)
上的多个列上尝试过索引。这些列都没有解决问题。
这个SQL小提琴显示了我遇到的问题:http://sqlfiddle.com/#!9/77861/2
有没有办法解决这个问题?
答案 0 :(得分:2)
Subrata Dey Pappu有一个正确的想法,他说用一个小样本集判断查询性能是不好的测试,以查看查询性能。在您的情况下,查询优化器确定更容易对5行进行全表扫描并使用quicksort对订单进行排序,而不是使用您创建的复合索引(active, season_average)
。运行解释计划就可以看出这一点:
它显示了active_seasonAverage
可能的关键选项,但是没有key
用于那个小样本数据集。
虽然增加样本集大小将调整查询优化器访问数据的方式(如上面评论中的Subrata Dey Pappu所示),但您可以通过运行来欺骗它(不建议硬编码到您的应用程序中)相同的查询但是如此:
SELECT
*
FROM `group` force index (active_seasonAverage) WHERE active=1
ORDER BY season_average DESC
这会强制查询优化器使用您的复合键,解释计划将如下所示:
请注意key
不是NULL
,而是使用active_seasonAverage
而Extra
下没有Using filesort
。
此外,对于小型数据集测试,请参阅Mysql手册页How MySQL Uses Indexes中的以下摘录:
索引对于小型表或大型表的查询不太重要 报表查询处理大多数或所有行的位置。当一个查询 需要访问大多数行,顺序读取比快 通过索引工作。顺序读取可以最大限度地减少磁盘搜索 如果不是查询所需的所有行。
因此,使用现实和大量数据对各种索引进行测试,通过Explain运行测试。