まあ、確認してみましょう...
ここでは約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
(このクエリの場合は、とにかく)のインデックスはありません。
まあ、いずれのクエリも有効ではないので、私は助言することができません – Strawberry
@Strawberryは 'のために有効ではありませんか? – Drupalist
不在のコンマがありません – Strawberry