7

3つの列に基づく複合インデックスがあります。そのうちの2つはクエリで制約され、3つ目は句による順序ですが、mysqlは並べ替えにインデックスを使用しません。

public_private='public'およびapproveled='yes'のビデオからselect*をnumber_of_viewsdescで説明します。

+ ---- + ------------- + -------- + ------ + -------------- ------------------ + ------ + --------- + ------ + ------- -+ ----------------------------- +
| id | select_type | テーブル| タイプ| possible_keys | キー| key_len | ref | 行| エクストラ|
+ ---- + ------------- + -------- + ------ + -------------- ------------------ + ------ + --------- + ------ + ------- -+ ----------------------------- +
| 1 | シンプル| ビデオ| すべて| 承認済み、承認済み_3、承認済み_2 | NULL | NULL | NULL | 1476818 | whereを使用する; 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が結果をソートするためにインデックスを使用するように強制するにはどうすればよいですか?

4

5 に答える 5

14

あなたが持っているクエリは、おそらくテーブル内のデータの大部分と一致していると思います。このような状況では、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;

ただし、いくつかのテストを実行して、取得したものがMySQLオプティマイザーが選択したものよりも実際に高速であることを確認します。どうやらオプティマイザーには注文の選択にいくつかの問題があるので、これを試してみて、パフォーマンスが向上するかどうかを確認することができます。

于 2009-07-17T18:06:30.890 に答える
1

複合キーでは順序が重要です。キーだけnumber_of_viewsを使用して並べ替える場合は、次を変更します。approved_2

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

に:

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

MySQLの複合キーは左から右に機能します。上記の例では、、、を使用して宣言されたキーは、number_of_views暗黙的に次のインデックスを作成します。approvedpublic_private

  • number_of_views
  • number_of_viewsapproved
  • number_of_views、、approved_public_private
于 2009-07-17T18:19:17.573 に答える
0

これは機能するはずです:

`select * from videos where approved='yes' and public_private='public' order by number_of_views desc;` 

そうでない場合は、に別のインデックスを作成するだけnumber_of_viewsです。

これは機能する必要があります。

(mysqlは基本的に左右のシーケンスに従います。したがって、このシーケンスで使用しないと、、のインデックスapprovedpublic_private機能しnumber_of_viewsません。つまり、左から3つすべて、左から2つ、または左端の1を使用できます。ただし、機能しません。左端のものを使用しない場合は、それがアイデアです。)

別のインデックスを使用するとnumber_of_views自動的に並べ替えられますが、これは役に立ちますorder by-これは確かです。

于 2011-03-08T18:00:44.630 に答える
-2

複合キーでは順序が重要です。ルールを忘れてしまいましたが、順番を変えてみてください。

于 2009-07-17T10:38:55.617 に答える
-2

number_of_views列に別のインデックスを追加して、それが機能するかどうかを確認します。

キーが3つの列の組み合わせである場合、操作を実行するために3つすべてを使用している場合にのみ、その特定のキーが使用されます。

于 2009-07-17T11:36:09.870 に答える