Я работаю над проектом, в котором около 3 миллионов записей сохраняются в базе данных MySQL.Модель выглядит так:
class Record(models.Model):
rec_type = models.CharField(...)
rec_value = models.FloatField(...)
rec_prop1 = models.CharField(...)
...other fields...
class Meta:
ordering = ['rec_value']
Типичный запрос содержит диапазон цели rec_value , определенный rec_type , А иногда и конкретный rec_prop1 .Действие запроса используется гораздо чаще, чем действие добавления записи.
Моя функция запроса написана так:
def find_target(value_from,value_to,type=None,prop1=None):
search_set = Record.objects.all()
if type: #not None
search_set = search_set.filter(rec_type=type)
if search_set.count == 0:
return []
if prop1: #not None
search_set = search_set.filter(rec_prop1=type)
if search_set.count == 0:
return []
search_list = search_list.filter(rec_value__gte=value_from,rec_value__lte=value_to)
result_list = []
for rec in search_list.values(...): #only get useful fields
result_list.append(some_runtime_calculation_about_rec)
return result_list
Код работает нормально, но занимает около 7 секунд для каждого запроса.В настоящее время индексация не используется.Я хочу улучшить производительность запросов.Я искал в Интернете решения и научился использовать QuerySet.values () и индексацию базы данных.Проблема в том, что поле rec_type имеет только 3 возможных значения (например, A, B, C), и большинство записей (около 70%) принадлежит одному из них (например, а).Поле rec_value фильтруется в каждом запросе, поэтому я сделал его упорядоченным в классе Meta в модели. rec_prop1 имеет около 10 возможных значений, но в большинстве запросов оно остается равным None, что означает отсутствие фильтрации.У меня вопрос, должен ли я индексировать rec_type , rec_value или rec_prop1 ?Учитывая, что rec_value уже заказано и rec_type имеет распределение дисбаланса и несколько возможных значений и rec_prop1 обычно не фильтруется?Есть ли способ повысить производительность функции запроса в моем случае?Я все еще учусь о Джанго и Базе данных.Я очень ценю ваши предложения и помощь.Большое спасибо.