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