Всем доброго времени суток!
Имеется небольшой код который создаёт базу и туда закидывает тестовые данные, а затем делает обращение к базе SELECT запросом:
@profile # декоратор для профайлера
def do():
import os
import sqlite3
# смотрим есть ли уже база на дсике
is_db_exist = os.path.isfile('./123.db')
print('is_db_exist: {}'.format(is_db_exist))
# return
db = sqlite3.connect('123.db')
# базы на диске нет, значит создаём структуру и добавляем данные
if not is_db_exist:
# создаём базу
db.execute('''
CREATE TABLE task_list (
id INTEGER PRIMARY KEY AUTOINCREMENT
);
''')
db.execute('''
CREATE TABLE dict (
id INTEGER PRIMARY KEY AUTOINCREMENT,
[key] TEXT,
value TEXT,
task_id REFERENCES task_list (id)
);
''')
db.execute("INSERT INTO task_list (id) VALUES (NULL);")
db.commit()
# добавляем тестовые записи
for i in range(300000):
db.execute('''
INSERT INTO 'dict' ('task_id', 'key', 'value') VALUES
('{0}', 'key_1', 'data_1'),
('{0}', 'key_2', 'data_2'),
('{0}', 'key_3', 'data_3'),
('{0}', 'key_4', 'data_4')
'''.format(i))
db.commit()
# проверяем что всё нормально добавилось
total_added = db.execute('SELECT count(*) from dict;').fetchall()[0][0]
print('добавлено записей: {}'.format(total_added))
got = db.execute('select [key], value from dict where task_id like 1')
fetched = got.fetchall() # вот этот кусок выполняется целых 0.5 секунд, вместо 0.001 секунд
db.close()
do()
Обратите внимание на этот кусок кода:
fetched = got.fetchall() # вот этот кусок выполняется целых 0.5 секунд, вместо 0.001 секунд
На одной машине (windows 7) он выполняется целых 0.5 секунд, а на другой (windows 8) 0.001 секунд.
Откуда-то взялась колоссальная регрессия. Я пробовал обновлять питон до последней версии 3.5.3 (в пределах ветки 3.5 эта версия последняя), но толку нету.
На стэке пишут надо добавить индексы и будет всё хорошо, но что-то мне они не помогли.
Коллеги, куда копать, что делать?