Назад | Перейти на главную страницу

Многоядерная оптимизация MySQL MyISAM

Я заметил, что наше приложение не отвечает на запросы, когда выполняется требовательный запрос. Бег top похоже, определяет источник проблемы:

top - 13:54:25 up 1 day, 13:43,  2 users,  load average: 1.02, 0.98, 0.83
Tasks: 110 total,   1 running, 109 sleeping,   0 stopped,   0 zombie
Cpu(s): 11.9%us,  1.1%sy,  0.0%ni, 86.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.2%st
Mem:   3145728k total,  2329220k used,   816508k free,        0k buffers
Swap:   131072k total,   128164k used,     2908k free,  1585060k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
26073 mysql     20   0  397m 209m 3452 S 99.1  6.8   3:02.49 mysqld             
16419 mailnull  20   0  9848 3288 2664 S  2.3  0.1   1:17.63 exim               
 2085 nobody    20   0 44312  10m 3436 S  1.3  0.3   4:50.98 litespeed          
24727 nobody    20   0  320m  50m  41m S  0.3  1.7   0:06.86 lsphp5             
26314 root      20   0  2428 1104  832 S  0.3  0.0   0:00.36 top                

Мне кажется, что mysql загружает весь процессор, на котором он работает (99,1%). Это означает, что одно из наших ядер настроено на 100%, а остальные 7 (семь!) Простаивают при 0%.

Я понимаю, что если бы наши таблицы были InnoDB, нагрузка была бы распределена между ядрами. Это верно?

Есть ли способ распределить рабочую нагрузку между ядрами наших таблиц, использующих MyISAM?

Я ищу совсем не в том месте? В то время как ресурсоемкий запрос загружает один ЦП, не должен ли MySQL использовать другой ЦП для отдельных запросов? Или это ограничено нашим использованием MyISAM?

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

Таблицы MyISAM выполняют «блокировку на основе таблиц», что означает, что любой запрос, блокирующий таблицу, обязательно блокирует все другие запросы, которые могут потребовать блокировки.

InnoDB использует «блокировку на основе строк» ​​для большинства операций, что позволяет другим запросам, которым не требуется блокировать именно эту строку, продолжаться параллельно.

Один большой запрос по-прежнему будет использовать только одно ядро, будь то MyISAM или InnoDB, но несколько запросов, попадающих в одну и ту же таблицу, должны иметь возможность выполняться одновременно на разных ядрах, при условии, что они не блокируются блокировками на уровне строк.