2016-11-19 5 views
0

をインデックス化されています。私は次のクエリませインデックスクエリ/準備警告で使用される - 私は主キーを持つMySQLのテーブルを持っていますが、列は

SELECT * FROM members WHERE club='adfsd'; 

をすれば、私が取得

CREATE TABLE `members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`type` char(1) , 
    `status` char(1) , 
    `enable` char(1), 
    `club` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=3714 DEFAULT CHARSET=utf8 ; 

Mysqliからの 'クエリに使用されたインデックスがありません/準備されたステートメント'という警告があります。それは十分公正です - 私は本当にそれにインデックスを持っている必要があります。私は、インデックスが作成されるクラブに

KEY `club` (`club`) 

をインデックスを追加 - 私はDESCRIBEを通してそれを見ることができますが、私はSELECTクエリを実行するとき、私は同じ取得「NOインデックスが使用されていない...」の警告を。

だから私は

KEY `clubind` (`club`) 

列名とは異なるものに索引名を変更し、クエリが警告なしで動作します。

他の列の1つに索引を作成し、 'status'とし、索引名として 'status'を使用し、その列を使用すると、すべてが正常に機能します。

私が見ることのできる唯一の違いは、問題のある列は整数であり、その他は文字であることです。

+0

クラブインテンシブ(10)unsigned NOT NULL' ...ここに何か間違っていますか? int列と文字列を比較しています。 –

+0

私は単純な誤植のためにこの質問を終了することに投票しています。 –

+0

私の例のクエリは誤解を招いていました。私は準備済みのステートメントを使用しているため、この例の誤植です。問合せは常に整数を使用します。インデックス名が列名と異なるときには、「インデックスが使用されていません...」という警告なしでクエリが機能する理由と問題点です。整数列に文字列を照会することとは関係ありません。 – user1199529

答えて

0

clubを整数と宣言しました。

あなたのクエリは次のとおりです。データ型を混在

SELECT * FROM members WHERE club = 'adfsd'; 

は、多くの場合、使用されてからインデックスを防ぐことができます。

また、クエリでインデックスを使用するかどうかは、テーブルのサイズによって異なります。インデックスの存在は、適切なクエリであっても、必ずしもそれが使用されることを意味するわけではありません。

+0

ダウンボートの理由はありますか?私は説明が正しいと思います。 –

+0

私の例はおそらく誤解を招いていました。私は準備済みの文を使用していて、フィールドバインディングは整数であったでしょう。したがって、クエリが だった場合SELECT * FROM members WHERE club = '11'; 同じ 'No index used ..'という警告が表示されます。私の主なポイントは、インデックス名がカラム名と同じである場合に警告なしでクエリが機能しないことですが、インデックス名がカラム名と異なる場合には機能します。 – user1199529

+0

@ user1199529 。 。 'club'が数字の場合は、それを文字列と比較しないでください。 –

関連する問題