2017-12-26 6 views
-1

wordidの列と50000個のレコードを含むテーブルwordsがあります。私は構造%XC%Aの単語がid=30000id=35000の間にあることを知っています。それらの間のいずれかの違いがある、SQLクエリの範囲がクエリ時間を短縮しますか?

SELECT * FROM words WHERE word LIKE '%XCX%A'

と時間のかかる観点から

SELECT * FROM words WHERE id>30000 and id < 35000 and word LIKE '%XCX%A'

は今、次のクエリを考えてみ?

+0

まあ、いずれのクエリも有効ではないので、私は助言することができません – Strawberry

+0

@Strawberryは 'のために有効ではありませんか? – Drupalist

+0

不在のコンマがありません – Strawberry

答えて

2

まあ、確認してみましょう...

ここでは約50000語のデータセットです。 (のみ35000の範囲30000)で単語の一部説明したパターンに従う:

EXPLAIN 
SELECT * FROM words WHERE word LIKE '%XCX%A'; 
+----+-------------+-------+-------+---------------+------+---------+------+-------+--------------------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra     | 
+----+-------------+-------+-------+---------------+------+---------+------+-------+--------------------------+ 
| 1 | SIMPLE  | words | index | NULL   | word | 14  | NULL | 50976 | Using where; Using index | 
+----+-------------+-------+-------+---------------+------+---------+------+-------+--------------------------+ 

EXPLAIN 
SELECT * FROM words WHERE id>30000 and id < 35000 and word LIKE '%XCX%A'; 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 
| 1 | SIMPLE  | words | range | PRIMARY  | PRIMARY | 4  | NULL | 1768 | Using where | 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 

我々は、2番目のクエリのみの間の行を走査しながら、最初のクエリは、データセット全体(50976行)をスキャンすることを確認することができ指定されたID(私の例では、IDは30000〜35000の間に約1768行あり、使用されていないIDがたくさんありますが、それはデータが作成された方法の副作用です)。

したがって、範囲を追加することで、MySQLはデータセットの1/5(最悪の場合は50000行ではなく5000行)だけスキャンする必要があります。このような小さなデータセットでは、大きな違いはありませんが、データセット100、またはこのサイズの1000倍になります。

注目すべきことは、2つのクエリが同じデータセットを返すことです(ただし、有効な値はそのID範囲内にのみ存在することがわかっているためです)が、必ずしも同じ順序でデータセットを返すわけではありません。一貫性を保つために、ORDER BY句が必要です。

'%...'はインデックスを使用できないため、word(このクエリの場合は、とにかく)のインデックスはありません。

+0

実際にはパターンに続く約20語があります。この場合、 'id'を使う価値があると思いますよね? – Drupalist

+0

いいえほとんど違いはありません – Strawberry

+0

@Drupalist - 先頭のワイルドカード( '%')が重要です。 'id'の範囲を使って行数を制限することは重要です。あなたができれば 'idの範囲を_してください。 –

関連する問題