Является ли get_option () быстрее, чем доступ к get_transient ()?

8

Сегодня я запускаю тест по моей базе данных, чтобы изучить разницу в скорости доступа к ключу из опций, пользовательских таблиц и переходных процессов. Я запустил тест 1000 раз, и вот время, необходимое для выполнения 1000 операций get:

  1. get_transient() 0,0245 секунд
  2. get_option() 0,0068 секунды
  3. операция простого выбора из пользовательской таблицы 0,65 секунды

Я также проверил, что переходный процесс не истек во время этого теста. Итак, вопрос в том, get_option()быстрее get_transient()или я что-то испортил в своем тесте? Настраивается ли задержка пользовательской таблицы из-за того, что WordPress кэширует параметры по умолчанию? Кроме того, параметры также кэшируются различными плагинами кэширования, такими как переходные процессы?

learning_13
источник
Ответ на этот вопрос является переменным, имея в виду, что при использовании кеша объектов переходные процессы вообще не будут использовать параметры. В любом случае это микрооптимизация и пустая трата времени. Автозагрузка в качестве опции просто переносит стоимость в другом месте
Том Дж. Новелл

Ответы:

15

Сегодня я запускаю тест по моей базе данных, чтобы изучить разницу в скорости доступа к ключу из опций, пользовательских таблиц и переходных процессов. Я запустил тест 1000 раз, и вот время, необходимое для выполнения 1000 операций get:

Имейте в виду, что таблица параметров используется как для параметров, так и для переходных процессов в большинстве систем, и эта таблица была оптимизирована с добавлением индексов. Так что это не честное сравнение

get_transient () 0,0245 секунд get_option () 0,0068 секунд операция простого выбора из пользовательской таблицы 0,65 секунд

Это также несправедливое сравнение, параметры с установленным autoloadпараметром будут загружены в расширенный в одном запросе в начале. Так get_optionчто тянет WP_Cache, вариант уже найден.

TLDR: На самом деле выборка не производится, она уже получена, она просто извлекается из памяти благодаря autoloadопции

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

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

Вопрос в том, быстрее ли get_option (), чем get_transient (), или я что-то испортил в своем тесте?

Это зависит:

  • В большинстве систем переходные процессы хранятся с использованием опций, оба включают get_optionвызов
  • Параметры с autoloadустановленным на true все загружаются в один вызов в начале, поэтому они хранятся в памяти, после этого запросы не выполняются
  • Кеширование объектов кэширует как параметры автозагрузки, так и переходные процессы

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

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

Кроме того, параметры также кэшируются различными плагинами кэширования, такими как переходные процессы?

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

стабильность

Все они кэшируются через, WP_Cacheпоэтому при втором запросе БД не задействована.

Изменчивость и она зависит

Все это предполагает общую основу, но как насчет объектных кешей?

Давайте представим экземпляр MemcacheD или экземпляр Redis (я НАСТОЯТЕЛЬНО рекомендую вам сделать это, если у вас есть возможность, ОГРОМНОЕ повышение производительности для хорошо построенных сайтов, особенно если вы используете их для кэширования страниц, если у вас нет чего-то вроде настройки Varnish)

Теперь у нас новая ситуация:

  • Теперь данные хранятся в оперативной памяти, и, как только они извлекаются из БД, они загружаются, и время доступа значительно сокращается. Все еще медленнее, чем переменная, но значительно быстрее, чем запрос к базе данных
  • Многие новые данные хранятся в WP_Cacheтом, что обычно нет. Например, WP_Postобъекты, мета и т. Д.
  • WP_Cache теперь сохраняется через запросы
  • MemcacheD и т. Д. Могут устранить просроченные переходные процессы и т. Д.

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

Так что для производительности я должен использовать переходные процессы или параметры?

Хотя вопрос стоит задаться вопросом, ответ таков: разница незначительна и находится в пределах погрешности

это не так просто

Так что прекратите микрооптимизацию, это один и тот же носитель, а это не стоит вашего времени

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

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

Есть намного лучшие вещи для оптимизации, которые дают значительно большую экономию, например, использование таксономий вместо мета в пост-запросах, не использование __notпараметров стиля, выполнение меньшего количества операций на странице, установка кеша объектов, уменьшение количества постов на странице, избегание удаленных запросов. так далее

А как насчет таблицы, которая будет ...

Нет, таблица параметров уже хорошо оптимизирована, использование пользовательской таблицы просто переместит операции за пределы системы WP Caching, заставив вас написать свою собственную.

Том Дж Новелл
источник
Касательно опции это автозагрузка в моем случае. Настраиваемая таблица содержит всего две строки и один запрос на выборку для извлечения данных.
learning_13
Я делаю это для своего плагина и должен выбирать между любым из них. Настроить пользовательскую таблицу было проще всего в соответствии с моим дизайном, но стоимость выборки достаточно велика, что задержит загрузку страницы.
learning_13
2
@ learning_13, вы задавали неправильный вопрос, и, может быть, нам с Томом не удалось передать сообщение в наших ответах - надлежащее кэширование сделает все, что вы решите использовать достаточно эффективно для сайтов, которые заботятся о производительности. Решение о том, как хранить данные, должно приниматься исходя из структуры вашего плагина и его функциональности, производительности должно быть последним, о чем нужно думать.
Марк Каплун
2
@ aim100k, пожалуйста, не вовлекай "родителей" в ответы здесь. То, что люди делают для своей жизни, не должно обсуждаться, если это не имеет отношения к ответу или вопросу. Если вам не нравится ответ, уменьшите его. Если вы чувствуете, что ответ может быть технически приемлемым, но оскорбительным, вы можете попробовать отредактировать его, отметить его или обсудить на мета-сайте.
Марк Каплун
@ mark-kaplun, скажем, я сохраняю данные в пользовательской таблице и извлекаю данные из нее для каждого пост-рендеринга, где мой плагин задействован для отображения некоторых данных. Итак, будут ли плагины кэширования или пользовательская оптимизация кэширования заботиться о кэшировании этой таблицы? И изменятся ли дополнительные усилия по реализации и дизайну только для того, чтобы использовать переходные процессы / опции вместо использования настраиваемой таблицы, которая вписывается в мой дизайн микро (преждевременно) -оптимизации по скорости загрузки страницы?
learning_13
4

Если объектное кэширование не найдено, он get_transientвызывает get_optionдва раза, один раз или интервал истечения и один для значения, поэтому он не будет быстрее.

get_optionПроизводительность сама по себе будет зависеть от того, является ли параметр «автозагрузкой» (по умолчанию) или нет. Все параметры автозагрузки извлекаются в одном запросе к БД и сохраняются в кеше памяти, поэтому их количество не должно сильно влиять на количество вызовов, get_optionдаже если это разные параметры.

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

Несмотря на все сказанное, я не уверен, что ваш тест был хорошим, но, тем не менее, все обсуждение бессмысленно, так как если вы действительно заботитесь о производительности, вы будете использовать систему кеширования объектов (и соответствующий плагин), которая значительно уменьшит время доступа к данным. нулю .... и, конечно, если вы решите использовать свои собственные таблицы БД, вам следует интегрировать свои API доступа с механизмом кэширования объектов.

Марк Каплун
источник