1

不適切なインデックスを持つテーブルがあり、任意のフィールドに入力できる php ページを作成しています。入力内容に基づいて結果が表示されます。実行したいクエリは次のとおりです。問題は、インデックスがないことですfname

select * from members where 1 and fname = 'Ryan' limit 30

クエリでインデックスを使用するにはlname、クエリに追加する必要があります。私が知らないのは、何もせずに追加する方法です(それが可能であれば)。

select * from members where 1 and lname = '{ANYTHING}' and fname = 'Ryan' limit 30

{ANYTHING}任意の値を意味するプレースホルダーとして使用しました。これを行うとインデックスが使用されますが、mysql にその列の内容を無視して検索するように指示するにはどうすればよいでしょうか (可能な場合)。

4

3 に答える 3

2

インデックスがオン(lname,fname)で、わからない場合lname、実行している種類のクエリではインデックスは本質的に役に立ちません。

考えてみれば、これは理にかなっています。インデックスは、最初に によってlname、次に によって順序付けられfnameます。全体をスキャンしないと、インデックス内のlname特定のものを見つける方法がありませんfname。これはもちろん、そもそもインデックスを使用する目的を無効にします。

これは、電話帳ですべての Johns または Erics を検索するようなものです (姓名の後に "索引付け" されています)。苗字がなければ、名前を知っていても役に立たないか、少なくとも電話帳全体をスキャンするよりもましではありません。

また、ここからMySQLドキュメントへの参照

列がインデックスの左端のプレフィックスを形成しない場合、MySQL はインデックスを使用できません。次に示す SELECT ステートメントがあるとします。

SELECT * FROM tbl_name WHERE col1=val1;

SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

SELECT * FROM tbl_name WHERE col2=val2;

SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;

(col1、col2、col3) にインデックスが存在する場合、最初の 2 つのクエリのみがインデックスを使用します。3 番目と 4 番目のクエリにはインデックス付きの列が含まれますが、(col2) と (col2, col3) は (col1, col2, col3) の左端のプレフィックスではありません。

于 2013-06-24T20:24:50.717 に答える