optimization - 优化我的 mysql 查询以使用索引进行排序

标签 optimization mysql indexing query-optimization

我有一个基于 3 列的复合索引,其中两列在我的查询中受到约束,第三列是 order by 子句,但 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 |
+----+-------------+--------+------+--------------------------------+------+---------+------+---------+-----------------------------+

The table structure is as follows:

CREATE TABLE `videos` (
  `indexer` int(9) NOT NULL auto_increment,
  `user_id` int(9) default NULL,
  `public_private` varchar(24) default NULL,
  `approved` varchar(24) default NULL,
  `number_of_views` int(9) default NULL,
  PRIMARY KEY  (`indexer`),
  KEY `approved` (`approved`,`user_id`),
  KEY `approved_3` (`approved`,`public_private`,`indexer`),
  KEY `approved_2` (`approved`,`public_private`,`number_of_views`),
) ENGINE=MyISAM AUTO_INCREMENT=1969091 DEFAULT CHARSET=utf8 |

如何强制mysql使用索引对结果进行排序?

最佳答案

我相信您的查询可能与表中的大部分数据相匹配。在这种情况下,MySQL 优化器通常会选择进行表扫描并完全忽略索引,因为这实际上比额外读取整个索引并使用它来挑选数据要快得多。因此,在这种情况下,我猜测 public_private='yes' 和 approved='yes' 与您表格的很大一部分相匹配。因此,如果 MySQL 因此跳过使用索引,那么它也不能用于排序。

如果你真的想让它使用索引,那么解决方案是使用FORCE INDEX:

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

但是,我会运行一些测试来确保您得到的结果实际上比 MySQL 优化器选择的要快。显然是优化器 does have some issues为订购做出选择,所以你绝对可以试一试,看看你是否获得了改进的性能。

关于optimization - 优化我的 mysql 查询以使用索引进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1142483/

相关文章:

javascript - require.js 和 r.js 依赖项

mysql - volatile 数据查询优化

javascript - 延迟加载 javascript

PHP LIKE QUERY 返回 0 条数据

python - 在 Pandas 数据框中高效快速地查找和匹配唯一值

python - 在整数序列中查找缺失元素的有效方法

python - 如何优化此 Google App Engine 代码?

mysql - 列表字段中的未知列 'username'

mysql - SQL 查询以查找所有记录的特定值

list - 在 Haskell 的列表中查找元素的索引?