2017-12-26 18 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

Absent inverted commas – 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 | 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 

우리는 첫 번째 쿼리가 전체 데이터 세트 (50,976 행)를 검사하여 볼 수 있습니다 주어진 ID (내 예제에서는 30000에서 35000 사이에 약 1768 개의 행이 있으며, 사용되지 않은 ID가 많이 있지만 데이터가 작성된 방식의 부작용 일뿐입니다).

범위를 추가하면 MySQL은 데이터 집합 중 1/5 만 스캔해야합니다 (최악의 경우 50000 행 대신 5000 행). 이러한 작은 데이터 세트에서는 많은 차이를 만들지는 않지만 데이터 세트 100 또는이 크기의 1000 배에 해당합니다.

한 가지주의해야 할 점은 두 값이 동일한 데이터 집합을 반환한다는 것입니다 (유효한 값은 해당 id 범위 내에서만 발견된다는 것을 알고 있기 때문에). 그러나 동일한 순서로 데이터 집합을 반환하지는 않습니다 . 일관성을 유지하려면 ORDER BY 절이 필요합니다.

'%...'은 인덱스를 사용할 수 없으므로 또 다른주의해야 할 점은 word (이 쿼리의 경우 어쨌든)입니다.

+0

실제로 패턴을 따르는 약 20 단어가 있습니다. 이 경우에는'id'를 사용할 가치가 있다고 생각합니다. 맞습니까? – Drupalist

+0

아니요. 거의 차이가 없습니다. – Strawberry

+0

@Drupalist - 주요 와일드 카드 ('%')가 중요합니다. 'id'의 범위를 통해 행 수를 제한하는 것이 중요합니다. '당신이 할 수있을 때'ID 범위를해라. –