Muh*_*han 7 mysql indexing optimization query-optimization
我有一个基于3列的复合索引,其中两列在我的查询中受约束,第三列是按顺序子句,但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 | +----+-------------+--------+------+--------------------------------+------+---------+------+---------+-----------------------------+
表结构如下:
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 |
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能强制mysql使用索引来对结果进行排序?
zom*_*bat 13
我相信你的查询可能匹配表中大部分数据.在这种情况下,MySQL优化器通常选择进行表扫描并完全忽略索引,因为它实际上比通过额外读取整个索引并使用它来挑选数据的麻烦更快.所以在这种情况下,我猜这public_private='yes' and 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;
Run Code Online (Sandbox Code Playgroud)
但是,我会运行一些测试来确保你获得的内容实际上比MySQL优化器选择的更快.显然,优化器在选择订购方面确实存在一些问题,所以你绝对可以试一试,看看你是否获得了改进的性能.
归档时间: |
|
查看次数: |
10765 次 |
最近记录: |