2016-04-01 13 views
0

テーブル内の10000レコードがあるテーブルINDEXED_MERCHANTを更新するために、次のSQLクエリを試しました。インデックスのキーとして「名前」と「A」の両方を索引付けして、更新クエリのパフォーマンスを向上させました。MySQLの更新クエリがインデックス付き列を使用していません

INDEXED_MERCHANT | CREATE TABLE `INDEXED_MERCHANT` (
    `ID` varchar(50) NOT NULL, 
    `NAME` varchar(200) DEFAULT NULL, 
    `ONLINE_STATUS` varchar(10) NOT NULL, 
    `A` varchar(100) DEFAULT NULL, 
    `B` varchar(200) DEFAULT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `NAME` (`NAME`,`A`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 | 

をここでこの手段の両方私のキーがインデックスキーとして認識されている次のようにコマンドSHOW CREATE TABLE INDEXED_MERCHANT;を実行することで、私は、出力結果を得るでしょう。次のコマンドを実行すると、「余分な」列の結果に、クエリがインデックスキーを使用していないことが示されます。私はどのように目標を達成するべきですか? 実行されたクエリ:EXPLAIN EXTENDED UPDATE INDEXED_MERCHANT SET ONLINE_STATUS = '0' WHERE NAME = 'A 205' AND A = 'P 205'; 結果:

+----+-------------+------------------+-------+---------------+------+---------+-------------+------+----------+-------------+ 
| id | select_type | table   | type | possible_keys | key | key_len | ref   | rows | filtered | **Extra**  | 
+----+-------------+------------------+-------+---------------+------+---------+-------------+------+----------+-------------+ 
| 1 | SIMPLE  | INDEXED_MERCHANT | range | NAME   | NAME | 906  | const,const | 1 | 100.00 | **Using where** | 
+----+-------------+------------------+-------+---------------+------+---------+-------------+------+----------+-------------+ 
+0

あなたはそのクエリに最適なインデックスを持っています。問題/質問は何ですか?複合インデックス( 'NAME'という名前で、' NAME'カラムと混同しないでください)を使用しています。 '906'と' const、const'は両方とも両方の列が関わっていることを示します。 '1行'も非常に良いです。 –

答えて

1

あなたのクエリは、出力列"key"を説明で明らかなよう"NAME"インデックスに当たっています。ここ

mysql documentation

キー

からkeyextra列の説明であるキー列は、MySQLが実際に使用することを決めたキー(インデックス)を示します。 MySQLがpossible_keys索引の1つを使用して行を検索することを決定した場合、その索引はキー値としてリストされます。句は次のテーブルに対して一致またはクライアントに送信する行を制限するために使用される

Aを使用

。テーブルからすべての行を取り出したり調べたりするつもりがない限り、Extra値がWhere whereを使用せず、テーブル結合タイプがALLまたはindexの場合は、クエリに問題がある可能性があります。 WHERE句のすべての部分にインデックスを使用していても、カラムがNULLの場合はWhereを使用すると表示されることがあります。

関連する問題