Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
Optimization 优化mymysql查询以使用索引进行排序_Optimization_Mysql_Indexing_Query Optimization - Fatal编程技术网

Optimization 优化mymysql查询以使用索引进行排序

Optimization 优化mymysql查询以使用索引进行排序,optimization,mysql,indexing,query-optimization,Optimization,Mysql,Indexing,Query Optimization,我有一个基于3列的复合索引,其中两列在我的查询中受到约束,第三列是ORDERBY子句,但mysql不使用索引进行排序 explain select * from videos where public_private='public' and approved='yes' order by number_of_views desc; +----+-------------+--------+------+--------------------------------+------+-----

我有一个基于3列的复合索引,其中两列在我的查询中受到约束,第三列是ORDERBY子句,但mysql不使用索引进行排序

explain select * from videos where public_private='public' and approved='yes' order by number_of_views desc; +----+-------------+--------+------+--------------------------------+------+---------+------+---------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------+------+--------------------------------+------+---------+------+---------+-----------------------------+ | 1 | SIMPLE | videos | ALL | approved,approved_3,approved_2 | NULL | NULL | NULL | 1476818 | Using where; Using filesort | +----+-------------+--------+------+--------------------------------+------+---------+------+---------+-----------------------------+
我应该怎么做才能强制mysql使用索引对结果进行排序?

组合键中的顺序很重要。我忘记了规则,但试着按不同的顺序来做。

number\u of\u views
列上添加一个单独的索引,然后看看它是否有效


如果一个键是3列的组合,则只有在使用全部3列执行操作时,它才会使用该特定键。我相信您的查询可能与表中的大部分数据相匹配。在这种情况下,MySQL优化器通常选择执行表扫描并完全忽略索引,因为这实际上比额外读取整个索引并使用它来挑选数据的麻烦要快。因此,在本例中,我猜
public\u private='yes'和approved='yes'
与表中的大部分内容匹配。因此,如果MySQL因此跳过使用索引,那么它也不能用于排序

如果您真的想让它使用索引,那么解决方案是使用
强制索引

select * from videos FORCE INDEX (approved_2) where public_private='public' and approved='yes' order by number_of_views desc;

但是,我会运行一些测试,以确保您得到的实际速度比MySQL优化器选择的要快。显然,优化器需要为排序进行选择,因此您完全可以尝试一下,看看是否可以提高性能。

在组合键中,顺序确实很重要。如果您只想使用
approved\u 2
键按
视图数进行排序,请更改:

KEY `approved_2` (`approved`,`public_private`,`number_of_views`)
致:

MySQL中的复合键从左到右工作。在上面的示例中,使用
视图数
已批准
公共
私有
隐式性声明的密钥在以下对象上创建索引:

  • 视图数量
  • 视图数量
    已批准
  • 视图数量
    已批准
    公共/私人
这应该可以:

`select * from videos where approved='yes' and public_private='public' order by number_of_views desc;` 
如果没有,只需在
视图的数量上创建一个单独的索引即可

这一定行得通

(mysql基本上遵循左右顺序。因此,如果不按此顺序使用,
approved
public\u private
number\u of_views
上的索引将不起作用。也就是说,您可以使用所有三个从左开始的、从左开始的2个或最左开始的1个。但如果不使用最左的一个,则不起作用,这就是想法。)


使用单独的索引将自动对视图的数量进行排序,这可能有助于按
排序,但我确信这一点。

此解决方案将剥夺
MySQL
对前两个字段进行筛选并对第三个字段进行排序的可能性。他问为什么索引不用于排序。您建议的索引只能用于排序。
@op
提出的索引可用于过滤和排序。您的索引不能用于筛选,但可能(或可能不)用于排序。我同意这是一个更好的解决方案,我只是试图回答所问的非常具体的问题。FORCE index解决了这个问题。现在查询的执行速度快得多,您对匹配大部分数据库的查询的看法是正确的。仅添加索引
number\u of_views
不会解决问题,因为将考虑满足
where
条件的索引。在OP的回答中,应使用索引
approved\u 2
,而不是单独使用
approved、public\u private
number\u视图的索引。否。正确的是:如果一个键是3列的组合,那么当它使用第一列、前两列或所有三列的组合时,它将使用该键
KEY `approved_2` (`number_of_views`,`approved`,`public_private`)
`select * from videos where approved='yes' and public_private='public' order by number_of_views desc;`