2012-03-28 12 views
0

私は次のように私が作成したインデックスがあるインデックスMySQLデータベースインデックスのパフォーマンスの問題

にしようとしているデータベースがあります。

CREATE INDEX <name> ON geoplanet_places(name(15)); 

私は次のクエリを実行すると:

SELECT * FROM geoplanet_places WHERE name LIKE "vancouver%"; 

結果は1秒未満で返されます

このクエリを実行すると、 al '%'ワイルドカード):

SELECT * FROM geoplanet_places WHERE name LIKE "%vancouver%"; 

結果の戻り時間が大幅に増加し、時には9秒以上でクロックインすることがあります。これは、データベースが索引付けされるまでに要した時間とほぼ同じです。

データベースには500万件を超えるレコードがありますが、なぜそれが減速しているのか理解しています。私が知りたいのは、MySQLでこのような巨大なパフォーマンスを達成することなく、名前の前にワイルドカードを実行することがあればです。

ありがとうございます。

答えて

1

MySQLインデックスは、列の先頭から作成されます。最初のクエリは、インデックスの15文字以内の列の先頭にある「vancouver」を検索します。しかし、2番目のクエリでは、 'vancouver' どこの列でもが検索されます。インデックスが15文字以内であるという保証はありません。インデックスがインデックス以外のどこかに表示される場合は非常に驚きますインデックス付き文字列セクションの開始) - クエリプランを見ると、エンジンが列内のすべての値を順番に調べているテーブルスキャンが表示されます。

MySQLのFULLTEXTインデックスを調べる必要があるように少し見えます - 前回私が検索エンジンを作るには不十分でしたが、あなたの問題を解決するかもしれません(現代のMySQLがFULLTEXT InnoDBテーブルやMyISAMテーブルのインデックスは、これまでのところ制限されていました)。

+0

完全に動作します、おかげさまで助けてください! – ThreadedLemon

関連する問題