Почему в таблице "параметры wp` нет индекса "загрузка`?


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

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

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

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

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

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

Author: Community, 2013-05-04

3 answers

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

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

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

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


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

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

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

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

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

 12
Author: fuxia, 2019-11-13 14:17:37

Я веду 3 блога WP на большом экземпляре Debian Squeeze и выяснял, почему mysql застрял на этом хосте при 200% загрузке процессора и загрузке системы между 3 и 6. Глядя на "список процессов отображения" внутри mysql, мы поняли, что таблица wp_option была вовлечена в эту проблему, поэтому мы выполнили:

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

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

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

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

 5
Author: Fabio Pedrazzoli, 2013-12-16 14:53:22

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

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

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

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

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

 0
Author: Jesse Nickles, 2019-12-05 13:48:02