Повысить производительность базы данных Django, ориентируя или индексируя? - PullRequest
0 голосов
/ 01 июля 2019

Я работаю над проектом, в котором около 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 обычно не фильтруется?Есть ли способ повысить производительность функции запроса в моем случае?Я все еще учусь о Джанго и Базе данных.Я очень ценю ваши предложения и помощь.Большое спасибо.

1 Ответ

0 голосов
/ 10 июля 2019

Я недавно продолжаю оптимизировать код. Во-первых, я обнаружил, что код

search_set.count == 0

можно оптимизировать как:

search_set.exists()

, что значительно улучшило производительность. (Время поиска от 7 с до 2,3 с). Во-вторых, индексация, похоже, мало влияет на производительность.

...