Почему в таблице `wp_options` нет индекса для` автозагрузки`?

15

В начале каждой страницы, обслуживаемой WordPress, есть вызов MySQL для получения параметров:

SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';

Поскольку для autoloadстолбца нет индекса , MySQL должен искать ВСЕ строки.

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

В своем приложении я использовал много переходных значений, чтобы служить заменой сеанса. Они работали отлично, и у меня есть свои собственные процедуры сбора мусора. Я заметил, что в wp_optionsтаблице все переходные значения (начинающиеся с _transient_) все имеют autoload=no. Я ожидаю, что количество строк в моей wp_optionsтаблице будет увеличиваться по мере увеличения числа одновременно работающих пользователей.

Я хотел бы знать, почему стол разработан таким образом. И я должен создать индекс для моего конкретного случая?

Он шиминг
источник

Ответы:

11

Индекса нет, потому что потребность в нем никогда не была достаточно сильной.

В билете № 14258 это было предложено, но, поскольку большинство опций используют autoload=yesпо умолчанию, индекс все равно будет игнорироваться.

Существует также открытый билет # 24044 _Добавить индекс в wp_options, чтобы повысить / улучшить производительность_ .

Я думаю, что вы должны создать индекс. Он переживет апгрейды. Это может не помочь вашей производительности, но вы можете добавить реальные статистические данные в этот тикет.


Обновление ноябрь 2019

Индекс был добавлен в WordPress 5.3. В заключение. См. Билет № 24044, упомянутый выше, и примечания разработчика к выпуску .

Обратите внимание, что если у вас есть существующий индекс с тем же именем, вы получите предупреждение во время обновления.

Из набора изменений :

Это изменение не затронет большинство сайтов, но на тех сайтах с большим количеством строк wp_options, только небольшое количество которых autoloadнастроено, будет наблюдаться значительное улучшение производительности.
Сайты с большим количеством строк wp_options, многие из которых autoloadнастроены, к сожалению, увидят снижение производительности поверх и без того очень медленных запросов, которые они выполняют, но это должно быть меньшинство случаев.

Фуксия
источник
1
Насколько я могу судить по чтению через # 24044, старые таблицы MyISAM получат снижение производительности, новые таблицы InnoDB в основном выиграют. Я конвертирую все свои устаревшие таблицы в InnoDB и устанавливаю индекс для autoloadстолбца.
Икра
После стольких лет, наконец, к нему обратилась команда WordPress. Индекс был добавлен вwp_options.autoload . Источники: make.wordpress.org/core/2019/10/15/… ... и ... core.trac.wordpress.org/ticket/24044#comment:87 ... Престиж @DanBUK, который предложил эту функцию в 2013 году.
Джи
Спасибо, @Jee, я обновил ответ.
fuxia
5

Я веду 3 блога WP на большом экземпляре Debian Squeeze и выясняю, почему mysql завис на этом хосте при 200% -ной загрузке ЦП и загрузке системы между 3 и 6. Посмотрев на «show process list» внутри mysql, мы поняли Таблица wp_option была вовлечена в эту проблему, поэтому мы выполнили:

alter table wp_options add index autoload_idx(`autoload`);

После этой операции загрузка mysql, как показано сверху, резко упала до 1%, а средняя нагрузка экземпляра теперь составляет 0.10.

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

Наша таблица wp_options имеет 347 строк.

Фабио Педраззоли
источник
2
Спасибо, что поделился. Я полагал, что WordPress действительно имел дефект в обработке этой таблицы параметров. Это так мало, что не должно быть запросов. Это должно быть select *раз и навсегда. Вместо этого он запрашивает каждый параметр, поэтому размещение индекса будет иметь большое значение.
Он Shiming
0

Хотя @fuxia принял ответ затрагивает некоторые «заявленные» причины (большинство из которых были заявлены сотрудниками Automattic по различным билетам Trac и т. Д.), Основная причина того, что WordPress Core не включает в себя индекс для параметров автозагрузки в wp_optionsтаблице, заключается в том, что Автоматик опасался, что это отрицательно скажется на производительности баз данных MySQL, которые все еще используют движок MyISAM.

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

Почти все другие причины, по которым индекс не добавлялся в течение последних 9 лет (да, с 2010 года в случае билета Trac # 14258 и с 2013 года в случае билета Trac # 24044 ) были неоднократно признаны неверными десятками членов Сообщество WordPress, однако сотрудники Automattic неоднократно игнорировали несколько независимых тестов производительности и возвращались к упоминанию проблем MyISAM.

К счастью, в конце 2019 года с PHP 7.2 теперь версия «по умолчанию», рекомендованная WordPress Core, и с движком InnoDB теперь по умолчанию в версиях MySQL после 5.5 , и с постоянным давлением со стороны различных разработчиков, включая @DanBUK, которые оставались в проблеме в течение многих лет Компания Automattic наконец сдалась и решила добавить индекс автозагрузки для WordPress 5.3+ в ноябре 2019 года.

Мы в LittleBizzy запустили первый известный плагин, который автоматически добавляет индекс, если он не существует, который все еще доступен на GitHub и регулярно загружается. Обратите внимание, что вам больше не нужно устанавливать такие плагины в ваш стек WordPress, если вы используете WP Core 5.3 + ...

jessuppi
источник