5

100 000 000 行の非常に大きなテーブルがあります。テーブルの構造

id         int          INDEX(not primary not unique just index)
lang_index varchar(5)   INDEX
name       varchar(255) INDEX
enam       varchar(255) INDEX

Ok。私はクエリを行います

1 クエリ

"SELECT name FROM table WHERE lang_index='en' AND name LIKE 'myname%'"

この大きなテーブルの速度は問題ありません。約0.02秒

私は2つのクエリを試します

"SELECT name FROM table WHERE lang_index='en' AND (name LIKE 'myname%' OR enam LIKE 'myname%')"

230秒前後で非常に遅い!!!

次に、この3つのクエリを試します

"SELECT name FROM table WHERE lang_index='en' AND enam LIKE 'myname%'"

スピードは素晴らしいです。約0.02秒

次に、2 つのクエリ (1 および 3 クエリ) の 2 番目のクエリをより高速に爆発させます。約0.04秒ですが、単純ではありません。

クエリが遅いのはなぜですか? 2 つのクエリは、1 つよりもはるかに高速です。これを行う必要があります。"SELECT name FROM table WHERE lang_index='en' AND (name LIKE 'myname%' OR enam LIKE 'myname%')" どうすれば高速化できますか?

4

1 に答える 1

5

このORキーワードは、MySQL のオプティマイザを狂わせます。

このようなことを試すかもしれません。

SELECT name FROM table WHERE lang_index='en' AND name LIKE 'myname%'
UNION
SELECT name FROM table WHERE lang_index='en' AND enam LIKE 'myname%'

または、FULLTEXT 検索を検討することもできます。MyISAM または MySQL 5.6 以降のバージョンが必要です。

編集* これらの最適化で何が起こっているのかを正確に知ることは困難です。これを試すことができますか?これにより、言語の選択があなたを混乱させているかどうかがわかります。

 SELECT name 
   FROM table 
  WHERE (name LIKE 'myname%' OR enam LIKE 'myname%')

これを試すことができますか?

SELECT name FROM table WHERE lang_index='en' AND name LIKE 'myname%'
UNION ALL
SELECT name FROM table WHERE lang_index='en' AND enam LIKE 'myname%'

完全な結果は得られませんが、重複した名前の項目が含まDISTINCTれますが、クエリの重複排除ステップはスキップされます。

これを試すこともできます。

SELECT name 
  FROM table
 WHERE lang_index='en'
   AND id IN (
    SELECT id from table 
     WHERE (name LIKE 'myname%' OR enam LIKE 'myname%'))
于 2012-10-05T12:49:24.730 に答える