2013-07-09 11 views
5

にどのように働くか、私はmysqlのテーブルを1つだけ持っているデータベースを使用しています17,151257 rows.Thisテーブルとが列文字列を持っている「データ」。私は、文字列の列が(「entered_query」変数に格納されている)特定のクエリ文字列が含まれているすべての行を印刷したいので、私は次のように使用:クエリ上記mysqlの選択クエリの最適化および制限は、MySQL

SELECT DISTINCT * from data WHERE string LIKE '%".$entered_query."%' limit 10

明らかなように実行するためにあまりにも多くの時間を取っています。

私は、この場合には、インデックスを使用することができることを読んしかし、どのようにしていますか?
Iはまた、10個の異なる列に全データを分割した後、
perlのDBIを用いて10個の並列クエリを実行すると考えています。

は、今、私が質問に次き:

  1. 実行時間を短縮する方法は?
  2. は、私が「LIKE」mysqlのクエリでは、上記のクエリのために任意のより良い代替手段があるので、インデックスを回避することを聞いたことがありますか?
  3. 我々はMySQLのクエリで上限10を使用する場合は、次にMySQLは、それは最初の10件の結果
+0

'$ entered_query'には、そうしなければ、あなたが望んでいないクエリをスピードアップする方法かもしれません。 – innaM

+0

'DISTINCT *'とは何ですか?また、入力した文字列のサイズの下限はありますか? – innaM

+0

@innaM DISTINCT *は一意のタプルのみを選択するために使用されます。 $ entered_queryには、ユーザーが「文字列」列「データ」を検索するために入力するクエリが含まれています。 *混乱する例を選んで申し訳ありません。 –

答えて

7

定期的なインデックスができ返すとすぐに、それは最初の10件の結果を見つけたか、最初のそれは特定のクエリのために全体のデータを検索して実行を停止しませんそのクエリを改善するために使用することはできません。 MySQLインデックスはBツリーです。つまり、インデックス付きカラムのプレフィックスを素早く見つけることができます。しかし、あなたのLIKEクエリの最初に%があるので、検索するユニークなプレフィックスはありません。したがって、すべての行をパターンに一致させるためにスキャンする必要があります。

しかし、MySQLはまた、フルテキスト検索をサポートしています。これは、列内のすべての単語のインデックスを作成し、これらの単語をすばやく見つけることができます。詳細は、documentationを参照してください。

あなたがLIMIT 10を使用する場合は、できるだけ早くそれが条件を満たして最初の10行を見つけるとスキャンを停止します。 ORDER BYも使用しない限り、最初の10を選択する前に並べ替えることができるようにすべての行を見つけなければなりません。

+0

ありがとう.... LIKEを使用せずに同じ結果を達成する理由はありますか?データ全体を10個の異なる行に分割し、perl DBIを使用して10個の並列クエリを実行する方法について説明します。 –

+0

私はLIKEを使わずにそれを行う方法を教えました。フルテキスト検索を使用してください。それを別々のクエリに分割すると、データベースサーバー上のコア数によって異なります。しかし、ボトルネックはディスクになる可能性が高いので、あまり役に立ちません。 – Barmar