글쎄, 알아 보겠습니다 ...
약 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 |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
우리는 첫 번째 쿼리가 전체 데이터 세트 (50,976 행)를 검사하여 볼 수 있습니다 주어진 ID (내 예제에서는 30000에서 35000 사이에 약 1768 개의 행이 있으며, 사용되지 않은 ID가 많이 있지만 데이터가 작성된 방식의 부작용 일뿐입니다).
범위를 추가하면 MySQL은 데이터 집합 중 1/5 만 스캔해야합니다 (최악의 경우 50000 행 대신 5000 행). 이러한 작은 데이터 세트에서는 많은 차이를 만들지는 않지만 데이터 세트 100 또는이 크기의 1000 배에 해당합니다.
한 가지주의해야 할 점은 두 값이 동일한 데이터 집합을 반환한다는 것입니다 (유효한 값은 해당 id 범위 내에서만 발견된다는 것을 알고 있기 때문에). 그러나 동일한 순서로 데이터 집합을 반환하지는 않습니다 . 일관성을 유지하려면 ORDER BY 절이 필요합니다.
'%...'
은 인덱스를 사용할 수 없으므로 또 다른주의해야 할 점은 word
(이 쿼리의 경우 어쨌든)입니다.
글쎄, 어느 쿼리도 유효하지 않으므로 우리가 조언 할 수있는 방법이 무엇인지 모르겠다 – Strawberry
@Strawberry가 ''때문에 유효하지 않습니까? – Drupalist
Absent inverted commas – Strawberry