powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сохранение скорости апдейта при росте таблице
55 сообщений из 55, показаны все 3 страниц
Сохранение скорости апдейта при росте таблице
    #38362924
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица выглядит так:

CREATE TABLE IF NOT EXISTS `map` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`userID` int(11) NOT NULL,
`objectID` int(11) NOT NULL,
`positionX` int(11) NOT NULL,
`positionY` int(11) NOT NULL,
PRIMARY KEY (`ID`),
KEY `userID` (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1057669 ;

Количество записей - 1057668
Данные 53.6 МБ
Индекс 14.5 МБ
Всего 68.1 МБ

Выполнение запроса вида "UPDATE map SET positionX=12 WHERE ID=777" на базе с нулевой нагрузкой происходит за 0.06-0.08 сек. Можно ли как-нибудь сократить это время, или это объективный предел (в смысле, оптимизировать тут просто нечего)?

В будущем планируется, что в таблице будет 40-50 млн. записей. Будут ли какие проблемы со скоростью апдейта? Индекс, по идее, вырастет примерно в 50 раз, т.е., составит 750Мб. Подозреваю, если по какой-то причине он не поместится в память (это не единственная таблица в БД), время апдейта увеличится существенно? Что можно предпринять заранее?
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38362980
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вы ТОЧНО не путаете примари кей и вторичный индекс?
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38362985
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, как сказать...

...
PRIMARY KEY (`ID`),
...

В апдейте:
UPDATE map SET positionX=12 WHERE ID=777
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363049
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихаилКИндекс, по идее, вырастет примерно в 50 раз, т.е., составит 750Мб.
А каким боком тут ваш этот индекс? Используемый индекс (который PRIMARY KEY (`ID`) ) - он вообще кластерный и места на диске не занимает, а от индекса KEY `userID` (`userID`) скорость выполнения этого запроса не зависит в принципе.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363062
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaА каким боком тут ваш этот индекс? Используемый индекс (который PRIMARY KEY (`ID`) ) - он вообще кластерный и места на диске не занимает

Да, так и оказалось. Удалил второй индекс и действительно ноль.

Так какое резюме? 50 млн - чепуховый объем и мне даже не париться на этот счет?
Текущий размер таблицы на диске 53.6Мб, в 50 раз больше - примерно 2.5Гб.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363151
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторон вообще кластерный и места на диске не занимает
не занудства ради а истины для - таки занимает, но мало. корневые станицы же.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363510
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowне занудства ради а истины для - таки занимает, но мало. корневые станицы же.
Структура хранения данных в InnoDB такова, что эта хрень (кластерный индекс и всё на него повязанное) имеет место быть всегда - даже если в структуре таблицы вообще нет ни одного индекса. А посему - это накладнЫе расходы на существование самогО объекта (ака таблица), а не на существование одной из структур (ака индекс), связанных с ним.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363543
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихаилКНу, как сказать...

...
PRIMARY KEY (`ID`),
...

В апдейте:
UPDATE map SET positionX=12 WHERE ID= 777 Как вы получили это значение? Почему именно 777 ?
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363794
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это просто пример запроса. Любое число от 1 до миллиона, результат тот же.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363818
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихаилКЭто просто пример запроса. Любое число от 1 до миллиона, результат тот же.то есть в реальном коде вам все равно, что обновлять, лишь бы написать UPDATE? Тогда может быть, вообще не указывать ID?
Код: sql
1.
UPDATE map SET positionX=12 -- и никаких where ?
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363825
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

Не понимаю Вашей озабоченности конкретным числом 777. Как уже было сказано, это всего лишь пример явно заданной константы.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363871
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftCygapb-007,

Не понимаю Вашей озабоченности конкретным числом 777. Как уже было сказано, это всего лишь пример явно заданной константы.Возможно, я и не прав, но (ПМСМ) поле ID в таблице MAP не может быть получено ниоткуда, кроме самой этой таблицы. Тогда каким образом в программе можно узнать, что нам требуется именно строка с id=777? Вероятнее всего, нужная строка определяется по остальным полям - userID,objectID. А если так - то нужны ли вообще как это поле, так и и первичный ключ по этому полю?

Все равно в связях к этой таблице будет что-то вроде
Код: sql
1.
join map om map.userID=users.userID and map.objectID=obj.objectID



Если ID - всего лишь дань моде вставлять в каждую таблицу (надо или не надо) автонумератор, то от него нужно избавиться. В качестве первичного ключа нужно указать пару полей (userID,objectID). Такой первичный ключ, в отличие от "ниочемного" ID, предотвратит дублирование значений этих полей в таблице.

Если же значения полей userID,objectID могут дублироваться - то это нарушение 3нф
В этом случае map.ID - необходимое поле, но формируется оно в другой таблице, а в map - FK на ту таблицу, но никак не AUTO_INCREMENT

Вот поэтому я и заинтересовался происхождением числа 777.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363886
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Возможно, я и не прав, но (ПМСМ) поле ID в таблице MAP не может быть получено ниоткуда, кроме самой этой таблицы.Вариантов - легион. Например, открывает пользователь документ. Вдруг ему надо узнать, например, фамилию человека, который этот документ создал. В документе есть ссылка на ID пользователя-создателя. Вот тогда в базу и отправляется запрос типа SELECT fio FROM usertable WHERE id=333.
На таблицу, помимо самой таблицы, могут ссылаться и другие таблицы, и пользовательский ввод (как ручной, так и из файлов).
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363915
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007Возможно, я и не прав, но (ПМСМ) поле ID в таблице MAP не может быть получено ниоткуда, кроме самой этой таблицы. Тогда каким образом в программе можно узнать, что нам требуется именно строка с id=777?

Сервер обрабатывает пакеты действий, присланные клиентом. Сначала действия накатываются на модели, если все действия валидны, измнения модели отражаются в базе. К моменту сохранения изменений модели в базе все первичные ключи всех записей, которые нужно проапдейтить, известны. Просто потому что они есть в модели.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363928
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

именно из-за ляма вариантов я и задал вопрос конкретно к ТС :)
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363932
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихаилК,

Но на вопрос, откуда в модели возник номер 777 — вы так и не ответили :)

Впрочем, не хочу разводить флейм на пустом месте. Если вас ничего не смущает, то мне и подавно фиолетово:)
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363942
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007Но на вопрос, откуда в модели возник номер 777 — вы так и не ответили :)


Сейчас модель считывается из БД перед обработкой пакета запросов.

В дальнейшем планируется использовать мемкеш, чтобы считывать ее один раз при коннекте и затем лазить в бд только с апдейтами. Естественно, про негарантированное хранение в мемкеше все в курсе.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363948
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихаилКCygapb-007Но на вопрос, откуда в модели возник номер 777 — вы так и не ответили :)


Сейчас модель считывается из БД перед обработкой пакета запросов.

В дальнейшем планируется использовать мемкеш, чтобы считывать ее один раз при коннекте и затем лазить в бд только с апдейтами. Естественно, про негарантированное хранение в мемкеше все в курсе.Окей, я понял. Где-то в интерфейсе осущестляется связка по user_id и object_id с данными этой таблицы, вносятся изменения в какую-то строку, и в сервер посылается запрос на изменение по id этой строки (вместо изменения по user_id и object_id). Не совсем логично - ну да пусть его, это ваш проект.

Вопрос снимаю, спасибо.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363951
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одно маленькое замечание. Если описанная мной схема верна – удалить индекс (user_id,object_id) — опрометчивое решение.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363960
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007Где-то в интерфейсе осущестляется связка по user_id и object_id с данными этой таблицы, вносятся изменения в какую-то строку, и в сервер посылается запрос на изменение по id этой строки (вместо изменения по user_id и object_id). Не совсем логично - ну да пусть его, это ваш проект.

На самом деле, идея не моя, но суть пакетной обработки действий через модель заключается как раз в том, что сокращается количество апдейтов бд, поскольку не пишутся промежуточные варианты. Например, пользователь userID передвигал объект objectID в перемешку с другими действиями 10 раз. Если каждому его действию будет соответствовать один запрос, то это будет 10 апдейтов. А при прогонке через модель - только один. То же самое, например, при покупке разных предметов на склад. При стандартной схеме у нас на каждую операцию один апдейт баланса в таблице пользователя и один инсерт/апдейт в таблице склада. При пакетной обработке 10 запросов на покупку разных предметов на слад у нас только один апдейт баланса в таблице пользователя и гарантированно не больше инсертов/апдейтов в таблице склада (позиции с одним itemID будут объединены в один инсерт/апдейт). А, например, в случае, когда предмет покупается на склад, а потом идет в производство, то при пакетной обработке таблица склада вообще не трогается, а при стандартном подходе - сначала будет запись прихода в таблицу склада, потом запись списания.

Короче, не все так очевидно, как кажется на первый взгляд.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38363966
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихаилК,

С идеей пакетной обработки я не спорю, но ей ни в коей мере не противоречит фиксация изменений в базе не по надуманному «номеру строки», а по «родной» связке юзера и объекта, по которой, собственно, и была доставлена в обработку исправленная запись (то есть по «естественному первичному ключу»). Поле id имеет право на существование, если на эту таблицу есть ссылки в других (дочерних для нее) таблицах, но для обеспечения FK полю id достаточно auto_increment unique not null, оно не является первичным ключем таблицы в смысле поиска в ней данных со строны «родительских» таблиц.

И снова — это чисто ИМХО, просто вариант для подумать.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364034
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Если ID - всего лишь дань моде вставлять в каждую таблицу (надо или не надо) автонумератор, то от него нужно избавиться. В качестве первичного ключа нужно указать пару полей (userID,objectID). Такой первичный ключ, в отличие от "ниочемного" ID, предотвратит дублирование значений этих полей в таблице.Ага, особенно удобно после этого делать внешние ключи на записи такой таблицы

К тому же (внезапно) в иннодб этот "автонумератор" всё равно есть, даже если вы его не создавали явно.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364072
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirCygapb-007Если ID - всего лишь дань моде вставлять в каждую таблицу (надо или не надо) автонумератор, то от него нужно избавиться. В качестве первичного ключа нужно указать пару полей (userID,objectID). Такой первичный ключ, в отличие от "ниочемного" ID, предотвратит дублирование значений этих полей в таблице.Ага, особенно удобно после этого делать внешние ключи на записи такой таблицы

К тому же (внезапно) в иннодб этот "автонумератор" всё равно есть, даже если вы его не создавали явно.Не совсем так. Ести есть PK, – то в качестве кластерного идекса используется именно он. Если PK нет, то принимается ближайший UNIQUE NOT NULL, и только если нет обоих – искуственно создается автонумератор.

А про удобство создания внешних ключей на таблицу — вы невнимательны…
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364095
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007и только если нет обоих – искуственно создается автонумератор.
Вы неверно прочитали мануал. Этот "внутренний автонумератор" в таблицах InnoDb есть ВСЕГДА. И ещё одно - доступ к нему получить НЕЛЬЗЯ. В принципе.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364113
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaВы неверно прочитали мануал. Этот "внутренний автонумератор" в таблицах InnoDb есть ВСЕГДА.А мне казалось, что только в случаях, когда нет ни первичного, ни уникального ключа.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364127
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaCygapb-007и только если нет обоих – искуственно создается автонумератор.
Вы неверно прочитали мануал. Этот "внутренний автонумератор" в таблицах InnoDb есть ВСЕГДА. И ещё одно - доступ к нему получить НЕЛЬЗЯ. В принципе.Позвольте все же не согласиться... http://dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html 14.2.3.12.2. Clustered and Secondary Indexes

Every InnoDB table has a special index called the clustered index where the data for the rows is stored. Typically, the clustered index is synonymous with the primary key. To get the best performance from queries, inserts, and other database operations, you must understand how InnoDB uses the clustered index to optimize the most common lookup and DML operations for each table.

When you define a PRIMARY KEY on your table, InnoDB uses it as the clustered index. Define a primary key for each table that you create. If there is no logical unique and non-null column or set of columns, add a new auto-increment column, whose values are filled in automatically.

If you do not define a PRIMARY KEY for your table, MySQL locates the first UNIQUE index where all the key columns are NOT NULL and InnoDB uses it as the clustered index.

If the table has no PRIMARY KEY or suitable UNIQUE index , InnoDB internally generates a hidden clustered index on a synthetic column containing row ID values. The rows are ordered by the ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order. там же, далее How Secondary Indexes Relate to the Clustered Index

All indexes other than the clustered index are known as secondary indexes. In InnoDB, each record in a secondary index contains the primary key columns for the row, as well as the columns specified for the secondary index. InnoDB uses this primary key value to search for the row in the clustered index.

If the primary key is long, the secondary indexes use more space, so it is advantageous to have a short primary key.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364132
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, надо было еще "If" выделить жирным красным
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364143
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле я влип в этот флейм из-за вот этого поста:МихаилКAkinaА каким боком тут ваш этот индекс? Используемый индекс (который PRIMARY KEY (`ID`) ) - он вообще кластерный и места на диске не занимает

Да, так и оказалось. Удалил второй индекс и действительно ноль.

Так какое резюме? 50 млн - чепуховый объем и мне даже не париться на этот счет?
Текущий размер таблицы на диске 53.6Мб, в 50 раз больше - примерно 2.5Гб.Как можно удалять индекс, по которому идет первичный поиск данных в таблице? Или вы хотите сказать, что в таблицах USERS и OBJECTS записан map_id=777 для обновляемой строки MAP?
Более того, этот индекс (вроде бы) должен быть хотя бы UNIQUE, если уж не PRIMARY KEY.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364184
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Позвольте все же не согласиться...
Наполовину позволяю. Чуть ниже:
авторIf no primary key was defined for a table, each clustered index record also contains a 6-byte row ID field.
Причём на самом деле требуется или primary, или unique key - простой key не подходит.

Эксперимент: небольшая таблица, имеется уникальное по содержимому поле ID.

Если создан уникальный (неважно, primary или просто unique) индекс на это поле - размер файла таблицы 448 кб.
Если его нет вообще - размер файла таблицы 480 кб (добавлен тот самый 6-byte row ID field).
Если индекс есть, но не указано, что он уникален - размер файла таблицы 560 кб (добавлен тот самый 6-byte row ID field, по нему построен кластерный индекс, а индекс по ID мотается сам по себе).
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364193
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaCygapb-007Позвольте все же не согласиться...
Наполовину позволяю. Чуть ниже:
автор If no primary key was defined for a table, each clustered index record also contains a 6-byte row ID field.
Причём на самом деле требуется или primary, или unique key - простой key не подходит.

Эксперимент: небольшая таблица, имеется уникальное по содержимому поле ID.

Если создан уникальный (неважно, primary или просто unique) индекс на это поле - размер файла таблицы 448 кб.
Если его нет вообще - размер файла таблицы 480 кб (добавлен тот самый 6-byte row ID field).
Если индекс есть, но не указано, что он уникален - размер файла таблицы 560 кб (добавлен тот самый 6-byte row ID field, по нему построен кластерный индекс, а индекс по ID мотается сам по себе).Перечитайте свою цитату
Как это коррелирует с вашим же утверждением?AkinaCygapb-007и только если нет обоих – искуственно создается автонумератор.
Вы неверно прочитали мануал. Этот "внутренний автонумератор" в таблицах InnoDb есть ВСЕГДА . И ещё одно - доступ к нему получить НЕЛЬЗЯ. В принципе.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364204
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Как это коррелирует с вашим же утверждением?Наполовину.

Или память немного подвела, или с того момента, когда написанное мной было верно, прошло много времени, и эти сведения устарели. Потому и поэкспериментировал немного, чтобы узнать, как оно сейчас.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364209
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем точно:AkinaЕсли индекс есть, но не указано, что он уникален - размер файла таблицы 560 кб (добавлен тот самый 6-byte row ID field, по нему построен кластерный индекс, а индекс по ID мотается сам по себе).Индекс по ID "мотается" не "сам по себе", а в привязке к автоматически сгенерированному кластерному индексу (доступа к значениям которого действительно нет из SQL запроса:) ).

И такова судьба каждого дополнительного индекса, независимо от того, сгенерирован кластерный индекс или указан разработчиком - "тянуть в себе" все поля, составляющие кластерный индекс :)
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364214
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaCygapb-007Как это коррелирует с вашим же утверждением?Наполовину. Ага-ага
"она была немножко беременна" (с)
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364322
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007с идеей пакетной обработки я не спорю, но ей ни в коей мере не противоречит фиксация изменений в базе не по надуманному «номеру строки», а по «родной» связке юзера и объекта, по которой, собственно, и была доставлена в обработку исправленная запись (то есть по «естественному первичному ключу»).

Вы предлагаете мне завести дополнительный составной индекс по двум полям и искать по нему, хотя я УЖЕ знаю значение праймери кей. И что, я выиграю в скорости? Если да, я так сделаю, но я не понимаю, почему я должен выиграть в скорости. Может быть, объясните?
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364332
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007, я так понимаю, Вы смотрите на данные с уровня БД. На самом деле, если смотреть на данные с уровня сервера приложения, то некоторые вещи выглядят иначе.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364342
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихаилКCygapb-007с идеей пакетной обработки я не спорю, но ей ни в коей мере не противоречит фиксация изменений в базе не по надуманному «номеру строки», а по «родной» связке юзера и объекта, по которой, собственно, и была доставлена в обработку исправленная запись (то есть по «естественному первичному ключу»).

Вы предлагаете мне завести дополнительный составной индекс по двум полям и искать по нему, хотя я УЖЕ знаю значение праймери кей. И что, я выиграю в скорости? Если да, я так сделаю, но я не понимаю, почему я должен выиграть в скорости. Может быть, объясните?Не совсем так... Я просто ну никак не могу понять - каким образом вы узнали ID. Вы так и не ответили на этот вопрос.

Нет, понятно, что к моменту, когда данные отображаются в интерфейсе, вы уже знаете все ID, - но по какому критерию они отбираются для отображения? Ну, или представлены в виде порции данных, соответствующей заданным критериям отбора, если так яснее смысл вопроса...

Выше я высказал свою версию - но вы ни согласились с ней, ни опровергли...

PS хотя если вы чохом закачиваете все-все данные в память, и уже в памяти смотрите, какие user_id и object_id заданы в фильтре, то тогда в базе индекс по этим полям, конечно, не нужен. Но нужно много памяти :)
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364347
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихаилКCygapb-007, я так понимаю, Вы смотрите на данные с уровня БД. На самом деле, если смотреть на данные с уровня сервера приложения, то некоторые вещи выглядят иначе.Да, в этом Вы правы...
Пусть тормозит БД - это не проблема приложения
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364414
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пропустил по невнимательности, извиняюсь...МихаилКCygapb-007Но на вопрос, откуда в модели возник номер 777 — вы так и не ответили :)


Сейчас модель считывается из БД перед обработкой пакета запросов.

В дальнейшем планируется использовать мемкеш, чтобы считывать ее один раз при коннекте и затем лазить в бд только с апдейтами. Естественно, про негарантированное хранение в мемкеше все в курсе.Сервер базы, сервер приложений, куча пользователей, работающих с моделью данных, представленной на сервере приложений.
Сервер приложений закачивает в себя все-все что есть в сервере базы, далее все пользователи работают только с сервером приложений, при валидности транзакции в модели она фиксируется в сервере базы данных.

Тогда понятно, и конечно лишние индексы только утяжелят базу.

Оптимальность фильтрации к серверу БД не имеет никакого отношения.
Составные индексы в БД - вредны, в том числе ( 14695748 ) KEY `userID` (`userID`)

Вопрос: а нафига в таком случае сервер базы (раз сервер приложений может хранить все-все "в себе") ?
Хотя это снова не моя проблемы, вопрос снимается.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364484
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007Не совсем так... Я просто ну никак не могу понять - каким образом вы узнали ID. Вы так и не ответили на этот вопрос.

Нет, понятно, что к моменту, когда данные отображаются в интерфейсе, вы уже знаете все ID, - но по какому критерию они отбираются для отображения? Ну, или представлены в виде порции данных, соответствующей заданным критериям отбора, если так яснее смысл вопроса...


На самом деле, я ответил. Причем уже раза два или три. Я знаю все ID, потому что они есть в модели. Кстати, интерфейс и модель - вещи разные, даже не совсем понимаю, откуда всплыл этот "интерфейс", речь же не о сайте идет, а об игровом приложении.

Общая логика такова.

При инициализации юзера в игре из базы считываются все данные по юзеру, которыми заполняется класс User - это модель юзера. Данные модели сериализуются в json и отправляются на клиент для визуализации. Перед отправкой данных на клиент, модель в виде объекта сохраняется в хранилище мемкеш (memcache). Это позволит при следующих пакетных запросах со стороны клиента не лазить в базу за считыванием актуального состояния модели пользователя, а получать ее из мемкеша с фактически нулевыми накладными расходами (что такое memcache гуглим самостоятельно).

Пакет, поступивший от клиента, прогоняется по модели и, если все в порядке, изменения накатываются на модель, записываются в базу (формируется пакет запросов update/insert/delete, которые отрабатываются на базе) а сама модель обновляется в мемкеше и цикл отработки пакетов запросов с клиента повторяется.

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

Поскольку мемкеш не обеспечивает гарантированного хранения информации, то в случае, если при поступлении пакета от клиента модели в мемкеше нет, она так же заново считывается из базы.

Как-то так, если общими словами.

Данная схема имеет ряд существенных недостатков и на первый взгляд не обеспечивает гарантированной целостности данных (разве что заморочиться с обновлением модели в рамках одной транзакции), но для игровых приложений - вполне достаточно.


ЗЫ. Соответственно, когда и я упомянул про работу с данными на уровне сервера приложения - я лишь имел в виду, что за счет организации данных и использования различных механизмов хранения информации можно существенно (по факту - в несколько раз) снизить нагрузку на базу.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364492
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007Вопрос: а нафига в таком случае сервер базы (раз сервер приложений может хранить все-все "в себе") ?


Нет, ну можно, конечно, хранить данные в текстовых файлах...
Но если есть такой механизм, как база данных - чего бы его не использовать? :)
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364523
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007Сервер приложений закачивает в себя все-все что есть в сервере базы, далее все пользователи работают только с сервером приложений, при валидности транзакции в модели она фиксируется в сервере базы данных.


Вот тут ошибка.
Не всю информацию, естественно, а только постоянную информацию по объектам/айтемам (она подкачивается по мере необходимости) и данные по активным пользователям в приложении. Как только пользователь выходит из приложения, его модель через некоторое время сбрасывается автоматически (если точнее - затирается другими данными)


Cygapb-007Составные индексы в БД - вредны, в том числе (14695748) KEY `userID` (`userID`)


Это теперь тоже составной индекс? :)
Индекс по userID нужен, чтобы выдернуть из таблицы map объекты конкретного юзера.


Кстати, что интересно, я так и не получил ответ на тот вопрос который изначально задавал. Перефразирую.
Может ли кто-нибудь обеспечить на своей таблице innoDB в млн записей и больше апдейт одной конкретной записи за время, скажем, меньшее, чем 0.01 сек и, если да, то как он этого добивается (какое железо, какие настройки и т.д.).
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364526
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ. Все разлеглось по полочкам.МихаилКCygapb-007по какому критерию они отбираются для отображения?При инициализации юзера в игре из базы считываются все данные по юзеру , которыми заполняется класс User - это модель юзера.Повторюсь, вопрос возник после фразы об удалении индекса:МихаилКAkinaА каким боком тут ваш этот индекс? Используемый индекс (который PRIMARY KEY (`ID`) ) - он вообще кластерный и места на диске не занимает

Да, так и оказалось. Удалил второй индекс и действительно ноль.

Так какое резюме? 50 млн - чепуховый объем и мне даже не париться на этот счет?
Текущий размер таблицы на диске 53.6Мб, в 50 раз больше - примерно 2.5Гб.Удаление индекса способствует ускорению считывания всех данных по юзеру из базы?

OFFTOP:МихаилКинтерфейс и модель - вещи разные, даже не совсем понимаю, откуда всплыл этот "интерфейс", речь же не о сайте идет, а об игровом приложении. То есть у игрового приложения нет интерфейса?? В котором в той или иной форме отображаются данные, представленные в модели? Вопрос риторический
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364556
МихаилК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007Повторюсь, вопрос возник после фразы об удалении индекса

Не-не :)
Это я скопировал таблицу и удалил из нее индекс, чтобы проверить, как изменился размер индекса.
В реальной таблице индекс остался.
Но, как я понимаю, на апдейт он не влияет, только на инсерт при создании профиля нового пользователя.


Cygapb-007То есть у игрового приложения нет интерфейса?? В котором в той или иной форме отображаются данные, представленные в модели? Вопрос риторический

Тут другое.

Когда сервер приложения представляет из себя сервер сайта, он сам формирует интерфейс и он доверяет тем данным, которые идут от интерфейса (ну, с соблюдением параметров авторизации, естественно). Есть разновидности, связанные с тем же ajax'ом, но сути это не меняет.

Когда сервер входит в игровое приложение, он НЕ формирует интерфейс и НЕ доверяет данным поступающим от клиента. Поэтому никаких апдейтов по ID, поступающим от клиента быть, естественно не может. Без проверки по базе, модели или еще как. Поэтому я и говорю, что интерфейс тут ни при чем.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364566
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007tanglirпропущено...
Ага, особенно удобно после этого делать внешние ключи на записи такой таблицы

К тому же (внезапно) в иннодб этот "автонумератор" всё равно есть, даже если вы его не создавали явно.Не совсем так. Ести есть PK, – то в качестве кластерного идекса используется именно он. Если PK нет, то принимается ближайший UNIQUE NOT NULL, и только если нет обоих – искуственно создается автонумератор.

А про удобство создания внешних ключей на таблицу — вы невнимательны…Вообще-то я это и написал: если явно не создали, то будет системный; если явно создали, будет созданный.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364570
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И насчёт невнимательности поясните, а то я такой невнимательный, что всю тему до того поста заново перечитал и всё равно не заметил, что же я пропустил
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364620
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirИ насчёт невнимательности поясните, а то я такой невнимательный, что всю тему до того поста заново перечитал и всё равно не заметил, что же я пропустил Прямо перед Вашим сообщением был пост 14699538 , с разносом в 1 час Cygapb-007МихаилК,

С идеей пакетной обработки я не спорю, но ей ни в коей мере не противоречит фиксация изменений в базе не по надуманному "номеру строки", а по "родной" связке юзера и объекта, по которой, собственно, и была доставлена в обработку исправленная запись (то есть по "естественному первичному ключу"). Поле id имеет право на существование, если на эту таблицу есть ссылки в других (дочерних для нее) таблицах, но для обеспечения FK полю id достаточно auto_increment unique not null, оно не является первичным ключем таблицы в смысле поиска в ней данных со строны "родительских" таблиц.Впрочем, теперь это уже не актуально.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364646
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir...tanglirК тому же (внезапно) в иннодб этот "автонумератор" всё равно есть, даже если вы его не создавали явно....
Вообще-то я это и написал: если явно не создали, то будет системный; если явно создали, будет созданный.Вообще-то вы писали про первичный ключ-автонумератор. Однако первичный ключ вовсе не обязан быть AUTO_INCREMENT (например, при отношении 1:0..1 для подчиненной таблицы) - и в этом случае никакой колонки "номер строки" (недоступной из SQL-запроса) для таблицы создано не будет, равно как не будет и автоматической нумерации строк этой таблицы.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364651
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автори только если нет обоих – искуственно создается автонумератор.
вы не правы. он есть всегда.

http://dev.mysql.com/doc/refman/5.1/en/innodb-multi-versioning.html

авторInternally, InnoDB adds three fields to each row stored in the database.
........................
A 6-byte DB_ROW_ID field contains a row ID that increases monotonically as new rows are inserted.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364657
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,
возражение - в первом сообщении второй страницы: 14700016
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364659
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторInternally, InnoDB adds three fields to each row stored in the database.
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364671
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,
Да, спасибо за уточнение. Поле DB_ROW_ID, никакого отношения к кластерному индексу не имеющее и необходимое для функционирования InnoDB. Если отсутствует допустимый в качестве кластерного индекс, создается новое поле, дублирующее значения DB_ROW_ID ("If InnoDB generates a clustered index automatically, the index contains row ID values. Otherwise, the DB_ROW_ID column does not appear in any index")
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364679
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уже хорошо. вы знаете что такое INNODB TABLE MONITOR OUTPUT?
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364687
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowуже хорошо. вы знаете что такое INNODB TABLE MONITOR OUTPUT?Только по поверхностному чтению документации:)

А скажите, пожалуйста, это имеет отношение к поставленному автором топика вопросу?
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364690
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к вопросу автора небольшое. оно имеет отношение к
авторсоздается новое поле, дублирующее значения DB_ROW_ID
...
Рейтинг: 0 / 0
Сохранение скорости апдейта при росте таблице
    #38364710
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow к вопросу автора небольшое . оно имеет отношение к
авторсоздается новое поле, дублирующее значения DB_ROW_ID Жаль ...

Но спасибо Вам за стремление исправить ошибочное понимание глубинных процессов, выполняющихся механизмом InnoDB в процессе выполнения транзакций. Когда появится больше свободного времени, я обязательно в качестве епитимьи прочитаю 14.2.3.11. InnoDB Multi-Versioning и связанные с этим вопросом темы :)
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сохранение скорости апдейта при росте таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]