марта 11, 2007

Немного о локах

Бывает такая хрень когда локи жить мешают. Т.е. заходит какой то slow SELECT, локает таблицу, пока он там думает, приходит пачка INSERTов и ждут...

У меня количество INSERTов в такой пачке иногда достигало max_used_connections

Ну или мускуль просто падал не в состоянии обработать такой поток данных.

Либо наоборот. Приходит какой то UPDATE, а за ним пачка INSERTов. Ну вообще это разные ситуации и чтобы их разрулить, надо неплохо рубить в движке мускуля

Помочь могу следующие фишки

1. concurrent_insert - параметр такой. Что делать с одновременными инсертами? 1 - ждать пока снимется лок с предыдущего, 2 - всунуть запись в конец таблицы. 1 - лучше для избежания фрагментации динамических таблиц. 2 - для производительности

2. Если INSERT/UPDATE треды мешают жить SELECTам, то можно поюзать low-priority-updates. Тогда апдейты будут иметь более низкие права на лок, чем SELECT. Т.е. поменяются местами

А вообще при проблемах с локами советую проверить запросы на правильность индексов а так же перейти на таблицы INNODB, у которых лок не на уровне таблицы, а на уровне строки данных.

Кстати, локать таблицы еще может периодический бекап mysqldump. Думпать рабочую нагруженную базу не советую, поднимите лучше репликацию, и думпайте SLAVE сервер.

Так же полезно почитать офф документацию: Table locking issues

Комментариев нет: