Ответ 1
"Эффективность ключа" - это показатель того, какое значение вы получаете от кэшей индексов, хранящихся в памяти MySQL. Если эффективность ключа высока, то чаще всего MySQL выполняет ключевые поиски из области памяти, что намного быстрее, чем необходимость извлекать соответствующие индексные блоки с диска.
Способ повышения эффективности ключа состоит в том, чтобы посвятить больше вашей системной памяти кешам индексирования MySQL. Как вы это делаете, зависит от используемого вами механизма хранения. Для MyISAM увеличьте значение размера ключа-буфера. Для InnoDB увеличьте значение размера пула innodb-buffer.
Однако, как указывает Майкл Икинс, в операционной системе также хранятся кэши дисков, к которым он недавно обращался. Чем больше памяти, доступной вашей операционной системе, тем больше дисковых блоков она может кэшировать. Кроме того, диски в самих случаях (и в некоторых дисковых контроллерах) также имеют кэши, что также может ускорить получение данных с диска. Иерархия немного похожа на это:
- fastest - получение индексных данных из кеша индекса MySQL. Стоимость - это несколько операций с памятью.
- получение индексных данных, хранящихся в кеше файловой системы ОС. Стоимость - системный вызов (для чтения) и некоторые операции с памятью.
- получение индексных данных, хранящихся в кеше дисковой системы (контроллер и диски). Стоимость - системный вызов (для чтения), связь с дисковым устройством и некоторые операции с памятью.
- медленнее - получение данных индекса с поверхности диска. Стоимость - это системный вызов, связь с устройством, физическое перемещение диска (перемещение руки + вращение).
На практике разница между 1 и 2 почти незаметна, если ваша система не очень занята. Кроме того, маловероятно (если у вашей системы меньше резервной памяти, чем у вашего контроллера диска), сценарий 3 будет запущен.
Я использовал серверы с таблицами MyISAM с относительно небольшими кэшами индекса (512 МБ), но массивная системная память (64 ГБ), и мне было трудно продемонстрировать ценность увеличения размера кеша индекса. Я думаю, это зависит от того, что еще происходит на вашем сервере. Если все, что вы используете, является базой данных MySQL, вполне вероятно, что кэш ОС будет достаточно эффективным. Тем не менее, если вы запускаете другие задания на одном и том же сервере, и они используют большое количество обращений к памяти/диску, тогда они могут вытеснить ценные кешированные блоки индекса, приводящие к частому удалению диска MySQL.
Интересное упражнение (если у вас есть время) заключается в том, чтобы возиться с вашей системой, чтобы она работала медленнее. Выполняя стандартную рабочую нагрузку на больших таблицах, уменьшайте буферы MySQL до тех пор, пока влияние не станет заметным. Сбросьте кеш файловой системы, перекачивая огромные суммы (больше, чем ОЗУ) нерелевантных данных через вашу файловую систему (cat large-file > /dev/null). Наблюдайте за iostat по мере запуска ваших запросов.
"Эффективность ключа" НЕ является показателем того, насколько хороши ваши ключи. Хорошо продуманные клавиши будут иметь гораздо большее влияние на производительность, чем высокая "Эффективность ключа" . MySQL, к сожалению, не может вам помочь.