Что такое MySQL "Key Efficiency" - PullRequest
       0

Что такое MySQL "Key Efficiency"

54 голосов
/ 02 октября 2010

MySQL Workbench сообщает о значении «Эффективность ключа» в связи с работоспособностью сервера.Что это означает и каковы его последствия?

alt text

С MySQL.com , «Эффективность ключа»:

... указание числа key_read_requests, которое привело к фактическому key_reads.

Хорошо, так что это значит.Что это говорит мне о том, как я должен настроить сервер?

Ответы [ 2 ]

81 голосов
/ 04 октября 2010

«Эффективность ключа» указывает на то, сколько вы получаете от кэшей индекса, хранящихся в памяти MySQL.Если ваша ключевая эффективность высока, то чаще всего MySQL выполняет поиск ключей из пространства памяти, что намного быстрее, чем необходимость извлечения соответствующих индексных блоков с диска.

Способ повысить эффективность ключа - выделитьбольше вашей системной памяти к индексным кешам MySQL.Как вы это сделаете, зависит от используемого вами механизма хранения.Для MyISAM увеличьте значение размера ключа буфера.Для InnoDB увеличьте значение innodb-buffer-pool-size.

Однако, как указывает Майкл Икинс, операционная система также содержит кэши дисковых блоков, к которым она недавно обращалась.Чем больше памяти доступно вашей операционной системе, тем больше дисковых блоков она может кэшировать.Кроме того, сами дисководы (и контроллеры дисков в некоторых случаях) также имеют кеши, которые также могут ускорить получение данных с диска.Иерархия выглядит примерно так:

  1. Самый быстрый - получение данных индекса из кэша индекса MySQL.Стоимость составляет несколько операций с памятью.
  2. извлечение данных индекса, которые хранятся в кэше файловой системы ОС.Стоимость - системный вызов (для чтения) и некоторые операции с памятью.
  3. извлечение данных индекса, которые хранятся в системном кэше диска (контроллер и накопители).Стоимость - системный вызов (для чтения), связь с дисковым устройством и некоторые операции с памятью.
  4. Самый медленный - получение данных индекса с поверхности диска.Стоимость - системный вызов, связь с устройством, физическое движение диска (движение руки + вращение).

На практике разница между 1 и 2 практически незаметна, если ваша система не оченьзанятый.Кроме того, маловероятно (если ваша система не имеет меньше оперативной памяти, чем ваш дисковый контроллер), что сценарий 3 вступит в игру.

Я использовал серверы с таблицами MyISAM с относительно небольшими кэшами индекса (512 МБ), но большой системной памятью (64 ГБ), и мне было трудно продемонстрировать значение увеличения размера кэша индекса.Я думаю, это зависит от того, что еще происходит на вашем сервере.Если все, что вы используете - это база данных MySQL, вполне вероятно, что кеш ОС будет достаточно эффективным.Однако, если вы выполняете другие задания на том же сервере, и они используют много обращений к памяти / диску, они могут высвободить ценные блоки кэшированного индекса, что приведет к более частому попаданию MySQL на диск.

Интересное упражнение (если у вас естьвремя), чтобы заставить вашу систему работать медленнее.Выполняя стандартную рабочую нагрузку на большие таблицы, уменьшайте буферы MySQL, пока влияние не станет заметным.Очистите кэш вашей файловой системы, пропуская через вашу файловую систему огромное количество (больше, чем ОЗУ) ненужных данных (cat large-file> / dev / null).Наблюдайте, как iostat выполняет ваши запросы.

«Эффективность ключа» НЕ является показателем того, насколько хороши ваши ключи.Правильно спроектированные ключи будут оказывать гораздо большее влияние на производительность, чем высокая «эффективность ключа».MySQL, к сожалению, не сильно вам там поможет.

7 голосов
/ 02 октября 2010

Key_read_requests - количество запросов на чтение блока ключей из кэша. В то время как key_reads - количество физических чтений блока ключа с диска. Итак, эти 2 переменные может увеличиваться самостоятельно. (http://bugs.mysql.com/bug.php?id=28384)

Что по-прежнему так же ясно, как грязь.

Перейдем к следующему объяснению:

Частично допустимое использование Key_reads

Существует частично уважительная причина изучить Key_reads, предполагая, что мы заботиться о количестве физических читает, что происходит, потому что мы знаем, что диски очень медленные по сравнению с другими части компьютера. И вот где я возвращаюсь к тому, что я назвал "в основном фактический" выше, потому что Key_reads на самом деле не являются физическими диск читает вообще. Если запрошенный блок данных не в операционной системный кеш, тогда Key_read является чтение диска - но если он кешируется, то это просто системный вызов. Тем не мение, давайте сделаем наш первый трудно доказать Предположение:

Трудно доказать предположение № 1: A Key_read может соответствовать физический диск читается, может быть. Если мы возьмем что предположение верно, то что другая причина, которую мы могли бы иметь для ухода о Key_reads? Это предположение приводит чтобы "пропустить кеш значительно медленнее, чем попадание в кеш, "что делает смысл. Если бы это было так же быстро, чтобы сделать Key_read как Key_read_request, что использовать буфер ключей в любом случае? Давайте поверим создателям MyISAM в этом один, потому что они разработали хит кэша Быть быстрее, чем мисс. (http://planet.mysql.com/entry/?id=23679)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...