Всем привет. Дело такое...
Делаю я сканер сайтмапа для своих проектов, все сделал все настроил (именно сканер), а вот с базой никак не могу разобраться (принцип работы такой, я сканирую первый раз сайтмап, ложу данные в таблицу 1, потом через время я повторно сканирую сайтмап и сохраняю данные в таблицу 2 (которая по структуре точно как таблица 1) по завершении скана я беру и сравниваю две таблицы на наличия новых урлов, изменений в тайтлах и т.д., и записываю изменения в таблицу 3 и после этого удаляю из таблицы 2 все данные для следующего сравнения, все работает нормально, но только на малых объемах т.е. до 100 000 еще терпимо, а когда в базе 500 000 и больше то один запрос сравнения занимает больше 300 секунд, сам я не специалист по базам пока что только учусь, и прошу подсказать как правильно нужно построить индексы для быстрого сравнения, вот пример одного из запросов которые я использую для сравнения
self.cursor.execute("""SELECT * FROM table1 LEFT JOIN table2 ON table1.url = table2.url WHERE table1.id_project = %s AND table2.url IS NOT NULL AND table1.title != table2.title""", (self.id,))
New_Url = self.cursor.fetchall()
if New_Url:
list1= []
list2= []
for value in New_Url:
list1.append( {"before":value[6], "after":value[14]} )
list2.append( (value[14], value[2], value[1]) )
json= json.dumps(list1)
self.cursor.execute("""insert into table3(id_site, name_changes, changes, date) values (%s, %s, %s, %s)""", (self.id, 'title', json, today) ) self.cursor.executemany ("""UPDATE table1 SET title=%s WHERE url=%s AND id_project = %s""", list2)
т.е. мне нужно выполнить запрос для выборки, а потом сделать апдейт и запись, я читал про индексы что их нужно строить так как будет выборка типа если сделать по первому и второму поля то индексы будут записаны поле1поле2, и нужно их делать только по тем полям по которым будет выборка, но как быть мне если у меня идет поочередная выборка с каждым столбцом, выходи что в индексы нужно добавить все столбцы?
вот моя таблица