1

次のように、正しい行を確実に更新するために「order by」句を使用する必要がある更新クエリがあります。

UPDATE `plugin_name_codes`
USE|FORCE INDEX abc
SET `plugin_name_entry_id` = 2
WHERE `plugin_name_codes`.`plugin_name_form_id` = 3
AND (plugin_name_entry_id IS NULL) 
ORDER BY /*plugin_name_form_id asc, plugin_name_entry_id asc,*/ id ASC
LIMIT 1

インデックスを使用して ID 列の並べ替えを行いたいのですが、次のようになります。

  1. インデックス ヒントは UPDATE クエリでは使用されません (MySQL のドキュメントによると)。

  2. ORDER BY 句は、インデックスをどのように作成しても (つまり
    、クエリ対象の 3 つの列 (plugin_name_entry_id、plugin_name_form_id、および id) すべてを使用するか、または
    最初の 2 つの列のみを使用して)、インデックスを無視するように見えます。

  3. ORDER BY 句にどの列を含めても、クエリは常にインデックスを無視します。

この ORDER 句により、各クエリに完全に 1 秒が追加されますが、これは非常に受け入れられません。インデックスを使用して ID で並べ替える方法、またはその他の回避策を知っている人はいますか?

4

1 に答える 1

0

複合インデックスについて簡単に説明します。最初に考慮すべきことは、データをクエリする方法です。のような複合キーがあり、(col1, col2)をクエリしようとすると、最初に左からすべてのキーを取得SELECT * FROM tbl WHERE col2 = 5する必要があるため、インデックスは使用されません。SELECT

ではUPDATE、インデックスが使用されるのはWHERE句 (および場合によってはORDER BY) のみです。上記の情報を考慮して、インデックスの左端の列が使用されていることを確認する必要があります ( plugin_name_form_id)。の複合キーがある場合(col1, plugin_name_form_id)、その update ステートメントはインデックスを使用しません。(plugin_name_form_id, col1)便利なように、インデックスの順序を逆にすることもできます。

お役に立てれば。

于 2012-09-05T00:28:38.583 に答える