2016-06-15 3 views
0

와 인덱스를 사용하지 sqlite3를 두 가지 인덱스 (각 쿼리 유형에 하나씩)가 필요합니다.파이썬은 내가 두 가지 방법으로 쿼리 하나의 열이있는 테이블이 LIKE

  • CREATE INDEX test_nocol ON sequences(seqs) 첫 번째 쿼리에 대해.
  • CREATE INDEX seqs_index ON sequences(seqs COLLATE NOCASE) 두 번째 쿼리 모든 좋은 데요,하지만 내가 python3의 sqlite3를 모듈을 추가하고, 원시 문자열과 함께 작동하는 대신이 쿼리를 시작하지만 매개 변수 바인딩을 사용하는 경우 COLLATE 인덱스가 갑자기 더 이상 사용되지 않습니다

:

>>> sql = 'explain query plan\n select seqs from sequences where seqs="blabla"' 
>>> c3.execute(sql).fetchall() 
[(0, 0, 0, 'SEARCH TABLE sequences USING COVERING INDEX test_nocol (seqs=?)')] 
>>> sql = 'explain query plan\n select seqs from sequences where seqs=?' 
>>> c3.execute(sql, ('hahahah',)).fetchall() 
[(0, 0, 0, 'SEARCH TABLE sequences USING COVERING INDEX test_nocol (seqs=?)')] 
>>> sql = 'explain query plan\n select seqs from sequences where seqs like "hahahah%"' 
>>> c3.execute(sql).fetchall() 
[(0, 0, 0, 'SEARCH TABLE sequences USING COVERING INDEX seqs_index (seqs>? AND seqs<?)')] 
>>> sql = 'explain query plan\n select seqs from sequences where seqs like ?' 
>>> c3.execute(sql, ('hahahah',)).fetchall() 
[(0, 0, 0, 'SCAN TABLE sequences')] 

여기서 내가 뭘 잘못하고 있니? 이것은 직렬화 백엔드이고 webapp DB가 아니기 때문에 원시 문자열을 사용할 때의 위협은 덜 심각하다고 생각하지만 적절한 SQL 형식을 사용하는 편이 낫습니다.

답변

1

documentation 말한다 다음 prepared statement는 표현이 sqlite3_prepare_v2() 또는 sqlite3_prepare16_v2()로 컴파일 된 포함 된 경우

오른쪽 문자열에 바인딩 된 parameter 경우,이 최적화는 시도됩니다. 오른쪽이 parameter이고 문이 sqlite3_prepare() 또는 sqlite3_prepare16()을 사용하여 준비된 경우 LIKE 최적화가 시도되지 않습니다.

이전 버전의 pysqlite 모듈은 sqlite3_prepare()을 사용합니다.

+0

감사합니다. python 표준 라이브러리 대신 sqlite3 (v.2.6.0) 모듈 대신 PyPI에서 pysqlite를 사용하여이 문제를 수정했습니다. 불행히도 나는 python3에 있고 pysqlite 패키지는 사용할 수 없다 (아직). http://stackoverflow.com/a/23414147/1271862 – glormph

관련 문제