3つのカラムに基づいた複合インデックスがあり、そのうちの2つはクエリで制約され、3つ目はorder by節であり、mysqlはインデックスをソートに使用しません。インデックスをソート用に最適化するために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 |
私は結果をソートするためにインデックスを使用してMySQLを強制的に行う必要がありますか?
FORCE INDEXが問題を解決しました。クエリは今よりはるかに高速に実行され、データベースの大部分に一致するクエリについては正しいです。 –
良いこと、うまくいきました。 – zombat