![]() |
|
Модераторы: skyboy |
![]()
|
|
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Насколько ресурсоемка эта операция?
Если в таблице около миллиона записиь и нужно по несколько раз в минуту делать UPDATE примерно 50-ти строк
Столбец id является PRIMARY KEY и на него есть INDEX. Что происходит с блокировкой? Добавлено @ 16:37 На таблице из 500 000 записей, запрос:
занял 0.0406 сек. Что же. Не так и мало времени... Добавлено @ 16:41 0.05*50=2,5сек. на обработку 50 простых UPDATE. Добавлено @ 16:41 Есть идеи, как оптимизировать можно? |
||||
|
|||||
| Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: 3 Всего: 56 |
Сделать еще на last_ process_id индекс
...и еще подумать... |
|||
|
||||
| Bikutoru |
|
|||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: 1 Всего: 22 |
Можно попробовать счиатать обновляемые записи в отдельную временную таблицу, обновить их там и заменить записи в исходной таблице записями из временной таблицы. Т.е. примерно так:
-------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
|||
|
||||
| Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: 3 Всего: 56 |
Bikutoru, а разве это по времени не больше получится?
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Какой размер у тебя key_buffer? (посмотреть можно в show variables) |
|||
|
||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 20 Всего: 40 |
это был я
-------------------- Бонифаций. |
|||
|
||||
| Bikutoru |
|
|||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: 1 Всего: 22 |
Не знаю, но я бы попробовал -------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
|||
|
||||
| Wowa |
|
||||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
я думаю, что однозначно это будет дольше. Добавлено @ 17:31
На сервере 2Гб оперативки. key_buffer - могу поставить такой, какой нужно. Как это повлияет? |
||||
|
|||||
| Бонифаций |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 20 Всего: 40 |
Поставьте скажем для начала 800М. Посмотрим что получится. Также посмотрите возможно ли использование update dealyed Добавлено @ 17:37 update delayed я имел в виду. Или то же самое update low priority -------------------- Бонифаций. |
||||||
|
|||||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
У меня есть идея разбить таблицу на блоки. Каждый блок из 50 записей состоять будет.
Добавить колонку block_id. И создать новую таблицу, в которой хранить уже block_id и last_ process. Обрабатывать придется все 50 записей(т.е. один блок) одновременно, поэтому у них будет last_ process естественно одинаковый. Соответственно нам нужно будет провести не 50 апдейтов, а только 1 и в таблице которая в 50 раз меньше. Может еще идеи есть? Добавлено @ 17:39 Минус в этой идеи в том, что выдавать блоки на обработку - мне нужно также по много раз в минуту. И делать тогда select придется не с одной таблицы, а сначала с выбирать блок, который нужно обработать с первой таблицы, а затем со второй таблицы SELECT * WHERE block_id=НОМЕР_БЛОКА. |
|||
|
||||
| Darhazer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 28.9.2005 Где: HellCity (Sofia, Bulgaria) Репутация: 4 Всего: 29 |
индекс ускоряеть поиск ( т.е. where ... ) но делаеть insert/update медленее. Так что думаю эта не хорошая идея если у тебя id уникальний в запросе можно добавить Limit 1, чтоб не искал других записев с id=56 -------------------- I'm a wheel, I'm a wheel, I can roll, I can feel But you can't stop me turning 'Cause I'm the sun, I'm the sun, I can move, I can run But you'll never stom me burning |
|||
|
||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 20 Всего: 40 |
Знаете что, попробуйте на одной большой таблице сделать все 50 update, а потом покажите какие значения будут у
key_reads и key_read_requests (я предполагаю вы используете myisam) -------------------- Бонифаций. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 1 Всего: 360 |
Вообще быстрее не получится. другие индексы - всё равно лишние.
Тормозит только из за большого количества записей. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
это ведь PRIMARY KEY. Вряд ли поиск идет дальше.. |
|||
|
||||
| Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: 3 Всего: 56 |
На счет создания индекса - сглупил (даже проверил это, чтобы убедиться
Wowa, мне кажется, что нужно оптимизировать задачу. Изходя из этого можно и структуру таблиц и запросов изменить |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |