MySQL имеет большую функцию под названием «Кэш запросов», который является весьма полезным для оптимизации производительности MySQL задач, но Есть ряд вещей, которые вы должны знать.
Прежде всего позвольте мне пояснить, что MySQL Query кэш — Я видел, число людей путают, думая, MySQL Query кэша такой же, как Oracle кэша запросов — то есть кэш, в котором планов выполнения кэшируются. MySQL Query кэша не является. Он не кэширует план, но полные комплекты результат. Это означает, что она является гораздо более эффективным, как запрос, который требуется обработка миллионы строк теперь можно мгновенно вызвал из кэша запросов. Это также означает, запрос должен быть точно такой же и детерминированные, так что частота попадания как правило, будет меньше. В любом случае это совсем другое.
Запрос кэш отлично подходит для некоторых приложений, как правило, простых приложений, развернутых на ограниченных масштабах или приложений, работающих с небольшими объемами данных. Например я использую кэша запросов на сервер, который работает этот блог. Обновления довольно редки так за столом детализации не проблема, у меня есть только один сервер и количество запросов мала, так кэш дублирование не является проблемой. Наконец, я не хочу, чтобы взломать WordPress для поддержки eaccelerator кэша или Memcached. Ну честно говоря, если производительность будет проблемой я бы начал с полного кэширования страницы, а не MySQL кэширование на уровне, но это другая история.
Поговорим немного о возможностях и ограничениях кэша запросов:
Прозрачное кэширование — Кэширование полностью прозрачно для приложения, и что очень важно не меняет семантику запросов — вы всегда получите реальные результаты запроса. Действительно Есть некоторые chevats — если вы не используете query_cache_wlock_invalidate = о блокировке таблицы для записи не будет недействительным кэш запросов, таким образом Вы можете получить результаты даже
если таблица блокируется и готовится в обновлении. Так что если вы используете кэш запросов в конфигурации по умолчанию вы не можете считать замок таблицы для записи будет означать, никто не сможет его прочитать — результаты еще могут поступать из кэша запросов, если Вы разрешите query_cache_wlock_invalidate = ON.
Кэширование запросов только полный — то есть он не работает на подзапросы, вложенные представления, части Союза. Это также общие missunderstanding.
Работы на уровне пакетов — Это одна из причин предыдущему пункту. Запрос кэш ловит сетевых пакетов, поскольку они направлены от клиента на сервер, а значит, может служить ответы очень быстро делать никаких дополнительных преобразования или переработки.
Работы до разбора — еще один повод для высокой производительности кэша запросов выполняет запрос поиска в кэше до парсинга запросов, поэтому, если результат подается с кэш запросов, запросов шаг анализа сохраняется.
Запросы должны быть абсолютно такими же, как не разбор сделано до поиска запросы не нормирован (потребует разбора), прежде чем кэш поиска, поэтому они должны соответствовать побайтно для попадания в кэш произойдет. Это означает, если вы поставите динамических комментарии в запросе, имеют дополнительное пространство или использовать другой случай — это будут различные запросы для кэша запросов.
Только SELECT запросы кэшируются SHOW команд или вызовов хранимых процедур нет, даже если хранимая процедура будет просто выбрать заготовку для извлечения данных из таблицы.
Избегайте комментарий (и пространстве) в начале запроса — Запрос кэш делает простой оптимизации, чтобы проверить, если запрос может кэшироваться. Как я уже говорил только SELECT запросы кэшируются — так это выглядит на первой буквы запроса и, если это «S», это происходит с запросом поиска в кэше, если нет — пропускает его.
Не поддерживает подготовленный текст выступления и курсоры Кэш запросов работает с текста запроса и хотите иметь полный набор результатов сразу. В подготовленных заявлений есть запрос с заполнителями и дополнительные значения параметра, которые потребуют дополнительного ухода — это не реализовано. Курсоры получить данные на куски так что это еще сложнее реализовать.
Может не работать с транзакциями — различные операции могут увидеть различные состояния базы данных, в зависимости от обновлений они выполнили и даже в зависимости от снимка они работают. Если вы используете заявления за пределами сделки у вас есть лучший шанс для них для кэширования.
Запрос должен быть детерминированным — Запрос может дать тот же результат независимо от того, сколько раз она запускается, если данные остается тем же. Таким образом, если запрос работает с текущими данными, использует недетерминированных функций, таких как UUID (), RAND (), connection_id () и т.д. он не будет кэшироваться.
Таблица уровень детализации в недействительной — Если таблица становится модификации всех запросов, полученных из этой таблицы становятся недействительными сразу. Большинство из них вполне вероятно, не было бы изменить свой результирующий набор, но MySQL не имеет возможности определить, кто из них будет так что избавиться от всех них. Это одна из основных особенностей, которая ограничивает эффективность кэш запросов — если у вас высокое писать приложения, такие как форумы, запрос эффективность кэш может быть довольно низким из-за этого. Существует также способ установить минимальный TTL или ничего подобного которая позволила другими системами кэширования. Также обратите внимание — все запросы будут удалены из кэша на таблицу изменений — если Есть много запросов в кэше это может уменьшить скорость обновления немного.
Фрагментация с течением времени — Со временем кэширования запросов может получить фрагментирован, что снижает производительность. Это можно рассматривать как большое значение Qcache_free_blocks относительно Qcache_free_memory. FLUSH QUERY CACHE команда может быть использована для запросов дефрагментацию кэша, но он может блокировать кэша запросов для достаточно длительного времени для больших кэшей запросов, которые могут быть неподходящими для интернет-приложений.
Ограниченное количество используемой памяти — Запросы постоянно недействительными из кэша запросов на обновления таблицы, это означает, количество запросов в кэш и памяти используются не могут расти вечно, даже если вы еще не очень большое количество различных запросов в настоящее время. Конечно, в некоторых случаях у вас есть таблицы, которые никогда не изменение которого приведет к затоплению запроса cahe но это необычно. Таким образом, вы можете установить кэш запросов на определенную величину и смотреть Qcache_free_memory и Qcache_lowmem_prunes — Если вы не получаете много lowmem_prunes и free_memory остается высоким вы можете уменьшить query_cache надлежащим образом. В противном случае вы могли бы пожелать, чтобы увеличить ее и посмотреть, если эффективность увеличивается.
Спрос рабочий режим, если вы только что позволит qury кэш он будет работать в «кэш все» режиме. В некоторых кэшей вы можете кэш только на некоторые из запросов — в этом случае вы можете установить query_cache_type на «спрос» и использовать только SQL_CACHE намек на запросы, которые вы хотите иметь кэширования данных — таких, как SELECT Col SQL_CACHE из Foo где ID = 5 . Если вы работаете в режиме по умолчанию вы можете также использовать SQL_NO_CACHE блокировать кэширования для некоторых запросов, которые вы знаете, не нужно для кэширования.
Подсчет запроса эффективность кэш Есть несколько способов вы можете посмотреть на query_cache эффективности. Первый смотрит на номер вашего выбирает — Com_select и посмотреть, как многие из них помещаются в кэш. Кэш запросов эффективность будет Qcache_hits / (Com_select + Qcache_hits). Как вы можете видеть, что мы должны добавить к Qcache_hits Com_select, чтобы получить общее количество запросов, как если бы запрос хит кэш происходит Com_select не увеличивается. Но если у вас есть только 20% попаданий кэша это означает, что она не стоит? Не совсем это зависит от того, какие запросы кэшируются, а также накладные расходы кэша запросов предоставляет. Одна часть запроса накладных кэш, конечно, вставки, чтобы вы могли видеть, сколько из вставлены запросы используются: Qcache_hits / Qcache_inserts Другие части накладных расходов происходит от модификации заявлений, которые можно вычислить по (Com_insert + Com_delete + + Com_update Com_replace) / Qcache_hits
. Вот некоторые цифры, которые вы можете играть с, но это трудно сказать, что хорошо или плохо, как много зависит от сложности заявление, а также, как много работы спасает кэша запросов.
Теперь давайте немного поговорим о конфигурации кэша запросов и mainance. MySQL Руководство довольно хорошо на этом: Кэш запросов Кэш запросов статусе запроса конфигурации кэша
Я бы просто отметить пару моментов — как защита от одного запроса вытирая всех запросов query_cache_limit вариант был реализован кэш, который ограничивает набор результатов, которые могут храниться в кэше запросов. Если вам нужно больше запросов для кэширования вы можете увеличить его, если вы наиболее важные запросы меньше, вы можете уменьшить его. Другая Qcache_lowmem_prunes — Это один используется для идентификации, если у вас достаточно памяти для кэша запросов. Заметим, однако, из-за фрагментации lowmem_prunes могут быть вызваны даже если есть свободное пространство, просто плохо фрагментированной.
Глядя на производительность я видел запроса предлагает кэш примерно в два раза производительность для простых запросов с выбора сделать первичный ключ, очевидно, нет верхней границы — очень сложные запросы, производить небольшой набор результат будет предлагать лучшее ускорение.
Так что, когда это хорошая идея использовать кэш запросов?
Стороннего приложения — Вы не можете изменить, как она работает с MySQL, чтобы добавить кэширование, но вы можете включить кэш запросов поэтому он работает быстрее.
Низкая нагрузка приложений — Если вы создаете приложение, которое не предназначено для экстремальных нагрузки, как и многие личные кэша запросов приложение может быть все что вам нужно. Особенно, если это в основном только для чтения сценария.
Зачем искать альтернативы?
Есть несколько причин, почему кэша запросов может быть не кэша для вашего приложения:
Это кэш запросов Применение объектов может потребоваться несколько запросов сочинять так что это эффективно кэшировать целые объекты, а не отдельные запросы.
Отсутствие контроля в таблице детализации недействительными часто слишком плохо. С другой кэши можно осуществлять на основе версий или тайм-аут основан недействительности, которые могут предложить гораздо лучше Hit Ratio для определенных приложений.
Это не так быстро кэша запросов быстро по сравнению с запуском запросы, но это еще не так быстро, как специально разработанные системы, такие как Memcached или местных общая память.
Он не может получить несколько объектов в то же время Вы должны запроса объекта кэша объект, который добавляет задержки, не существует способа вы можете запросить все объекты, которые должны быть получены в то же время (опять Memcached имеет его)
Это не распространяется Если у вас есть 10 рабов и использование кэша запросов по всем из них содержимое кэша, вероятно, будет то же, поэтому у вас есть несколько копий одного и того же данных в кэше эффективно тратить памяти. Distirbuted системы кэширования можно эффективно использовать память на нескольких системах, поэтому нет дублирования.
Memcached , вероятно, самой популярной системой распределенного кэширования и он прекрасно работает. Я должен написать статью сравнения производительности различных систем кэширования некоторое время.
Просмотров: 1250