Якщо є одне, що я можу сказати про MySQL, це те, що InnoDB, його транзакційний (сумісний з ACID) механізм зберігання, дійсно є багатопоточним. Однак він настільки багатопоточний, як ВИ КОНФІГУРУЄТЬСЯ !!! Навіть прямо "поза коробкою" InnoDB чудово працює в одному середовищі процесора, враховуючи його настройки за замовчуванням. Щоб скористатися можливостями багатопотокової роботи InnoDB, потрібно пам'ятати, щоб активувати безліч варіантів.
innodb_thread_concurrency встановлює верхню межу кількості одночасних потоків, які InnoDB може відкрити. Найкраще для цього встановити кругле число (2 X Кількість процесорів) + Кількість дисків. ОНОВЛЕННЯ : Як я дізнався з перших вуст на конференції Percona NYC, вам слід встановити це значення 0, щоб попередити InnoDB Storage Engine, щоб знайти найкращу кількість потоків для середовища, в якому він працює.
innodb_concurrency_tickets встановлює кількість потоків, які можуть безкарно обійти перевірку сумісності . Після досягнення цієї межі перевірка сумісності потоку знову стає нормою.
innodb_commit_concurrency встановлює кількість одночасних транзакцій, які можуть бути здійснені. Оскільки за замовчуванням дорівнює 0, не встановлення цього параметра дозволяє одночасно здійснювати будь-яку кількість транзакцій.
innodb_thread_sleep_delay встановлює кількість мілісекунд, за допомогою яких потік InnoDB може бути спокійним перед повторним введенням у чергу InnoDB. За замовчуванням - 10000 (10 сек).
innodb_read_io_threads та innodb_write_io_threads (обидва з MySQL 5.1.38) виділяють вказану кількість потоків для читання та запису. За замовчуванням - 4, а максимум - 64.
innodb_replication_delay накладає затримку потоку на підлеглому, якщо innodb_thread_concurrency досягається.
innodb_read_ahead_threshold дозволяє лінійне зчитування заданої кількості розширень (64 сторінки [сторінка = 16K]) перед переходом на асинхронне зчитування.
Час пішов би від мене, якби я назвав більше варіантів. Ви можете прочитати про них у документації MySQL .
Більшість людей не знають про ці можливості, а InnoDB дуже задоволений лише тим, що робить транзакції, сумісні з ACID. Якщо ви налаштуєте будь-який із цих варіантів, ви робите це на свій страх.
Я грав з MySQL 5.5 декількох екземплярів буферного пулу (162 ГБ у 9 буферних пулах) і намагався таким чином автоматично розділити дані в пам'яті. Деякі експерти стверджують, що це повинно забезпечити 50% підвищення продуктивності. Що я отримав - це тона блокування ниток, яка фактично змусила InnoDB сканувати. Я перейшов на 1 буфер (162 Гб) і все знову було добре у світі. Я думаю, вам потрібні фахівці Percona, щоб встановити це. Я завтра буду на конференції Percona MySQL в Нью-Йорку і запитаю про це, якщо надасть можливість.
На закінчення, InnoDB веде себе добре на сервері з декількома процесорами, враховуючи його настройки за замовчуванням для багатопотокових операцій. Налаштування їх вимагає великої турботи, великого терпіння, чудової документації та чудової кави (або Red Bull, Jolt тощо).
Доброго ранку, доброго вечора і доброї ночі !!!
ОНОВЛЕННЯ 2011-05-27 20:11
Повернувся з конференції Percona MySQL у Нью-Йорку в четвер. Що за конференція. Багато чого навчився, але я отримав відповідь, яку перегляну щодо InnoDB. Мені повідомив Рональд Бредфорд, що встановлення innodb_thread_concurrency до 0 дозволить InnoDB вирішити кращий курс дій з одночасністю потоку. Я буду експериментувати з цим далі в MySQL 5.5.
ОНОВЛЕННЯ 2011-06-01 11:20
Що стосується одного довгого запиту, InnoDB відповідає сумісності з кислотами та працює дуже добре, використовуючи MultiVersion Concurrency Control . Операції повинні мати можливість рівня ізоляції (повторення, що повторюється, за замовчуванням), що перешкоджає блокуванню доступу інших до даних.
Що стосується багатоядерних систем, InnoDB пройшов довгий шлях. Раніше InnoDB не міг працювати в багатоядерному середовищі. Я пам'ятаю, що потрібно запускати кілька екземплярів mysql на одному сервері, щоб отримати декілька ядер для розподілу декількох процесів mysqld по процесорам. Це більше не потрібно, завдяки Percona та пізніше MySQL (так, Oracle, кажучи, що все ще робить мене кляпом), оскільки вони розробили InnoDB в більш зрілий механізм зберігання даних, який може отримати доступ до ядер простоти без особливої настройки. Поточний примірник InnoDB сьогодні може добре працювати на одному ядерному сервері.