Найти - Пользователи
Полная версия: Скорость обновления строки mySql
Начало » Django » Скорость обновления строки mySql
1
kvadrat
Вопрос наверное не только про Джангу а про бд(mysql) вообще, хотя может джанга какие то свои особенности проявляет.
Есть список в бд (который видимо хранится в строковом типе поля). К нему периодически в определенные по индексу места будут добавляться новые элементы, какие-то будут удаляться. Существуют ли методы делать это быстрее чем заново переписывать всё поле каждый раз? Если такие методы существуют, какой с ними выигрыш в скорости?
alafin
Зачем делать такое “изящество” в виде хранения списка в виде строки? В подобном случае вы не сможете по нему нормально фильтровать записи и делать кучу других действий.

Как вариант предлагаю либо завязаться на конкретной СУБД в частности PostgreSQL и использовать его PGArray: https://www.djangopackages.com/grids/g/arrayfield/
либо чтобы не завязываться на конкретную СУБД сделать отдельную модель у которой будет ссылка на модель в которой вы собирались хранить список в строковом представлении а также нужные вам поля к примеру id.
kvadrat
alafin
В подобном случае вы не сможете по нему нормально фильтровать записи и делать кучу других действий.
Ага я про это и спрашивал. То есть нет такого способа общения с полем в mysql как с обычным списком. Про array в PostgreSQL слышал, для mySql не встречали такого?

alafin
сделать отдельную модель у которой будет ссылка на модель в которой вы собирались хранить список в строковом представлении
Если я вас правильно понял, у меня все так и есть. Есть модель в которая и хранит такие списки в строковом состоянии. Каждый раз обращаясь к определенному полю с целью проучить из строки фрагмент, или записать фрагмент туда, требуется прежде извлечь строку, изменить ее, затем снова записать в поле. Я интересуюсь способ редактировать содержимое строки, не извлекая её всю. Предложенный вами способ не позволяет так делать. Или я вас не правильно понял
FishHook
Зачем список то?
class Foo(Model):
    name = CharField(....)
class List(Model):
    list_item = CharField(....) # Или ItegerField или любой другой Field
    foo = ForeignKey(Foo)

Собственно, вот и весь список. Добавляйте, удаляйте, делайте что угодно без извращений.

foo = Foo.objects.get(name='bla-bla'))
lst = List.objects.filter(foo=foo) # Список
new_item = List.objects.create(foo=foo, list_item='new_record') # Добавляем
new_item.list_item='newest'
new_item.save()# Изменяем
List.objects.get(foo=foo, list_item='new_record').delete() # Удаляем
kvadrat
да я понимаю,что так правильно, в базах данный все так и происходит. а со списком вообще не правильно. но вопрос то именно такой - найти способ взаимодействия с одним полем(не знаю уже какого типа) не извлекая его полностью, а не создавать новые поля. если кому, что на ум придет, поделитесь пожалуйста.
FishHook
ИМХО это бред.
Lexander
kvadrat
но вопрос то именно такой - найти способ взаимодействия с одним полем(не знаю уже какого типа) не извлекая его полностью
MySQL такого не умеет.
Я вам больше скажу, ни одна СУБД такого не делает, т.к. минимум, что можно считать - одна запись, если ее размер совпадает с размером страницы БД и одновременно с размером кластера диска.
Если БД находится в памяти или на SSD, все равно считывается вся запись.
При обновлении поля, обновляется все поле целиком.
При получении части поля (часть строки, например) считывается все поле целиком.

ЗЫ
Не морочьте себе и нам :) голову, я очень сомневаюсь, что узкое место у вас - обновление поля в записи.
Это может быть только при использовании BLOB-полей.

Удостоверьтесь, что у вас используется таблица без сжатия, это будет гарантия отсутствия дефрагментации записей для вашей задачи.
inoks
FishHook
Зачем список то?
class Foo(Model):
name = CharField(….)
class List(Model):
list_item = CharField(….) # Или ItegerField или любой другой Field
foo = ForeignKey(Foo)

Собственно, вот и весь список. Добавляйте, удаляйте, делайте что угодно без извращений.

судя по описанной задаче, автору будет достаточно одной модели:
class List(Model):
    item = CharField(....)
alafin
kvadrat
Если я вас правильно понял, у меня все так и есть.
Нет, вы меня не правильно поняли, я имел в виду вариант который был предложен FishHook а именно:

class Foo(Model):
    name = CharField(....)
class List(Model):
    list_item = CharField(....) # Или ItegerField или любой другой Field
    foo = ForeignKey(Foo)

Такой вариант более правильный нежели хранить списки в строковом представлении.
kvadrat
всё понял. бд такого не может. спасибо за ответы
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB