Что быстрее, key_cache или кеш ОС? - PullRequest
0 голосов
/ 25 ноября 2010

в тб с 1 мил. строки, если я делаю (после перезагрузки компьютера - поэтому ничего не кэшируется):
1. SELECT price,city,state FROM tb1 WHERE zipId=13458;
результат - 23 строки в 0.270

после запуска 'LOAD INDEX INTO CACHE tb1' (key_buffer_size = 128M и общий размер индекса для tb составляет 82M): 2. SELECT price,city,state FROM tb1 WHERE zipId=24781;
результат составляет 23 строки в 0,252 с, Key_reads остается неизменным, Key_read_requests увеличивается на 23

BUT после загрузки zipId в кэш ОС, если я снова запрошу запрос:
2. SELECT price,city,state FROM tb1 WHERE zipId=20548;
результат - 22 строки в 0,006 с

Это простой пример, но я запускаю десятки тестов и комбинаций. Но результаты всегда одинаковы.
Я использую: MySql с MyISAM, WINDOWS 7 64, а query_cache равен 0; zipId это обычный индекс (не первичный ключ)

НЕ ДОЛЖЕН быть key_cache быстрее, чем кеш ОС ??
НЕ ДОЛЖНО быть огромной разницы в скорости после загрузки индекса в кеш ??
(в моем тесте это почти без разницы).

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

1 Ответ

0 голосов
/ 25 ноября 2010

При обычной обработке запросов MySQL будет сканировать индекс на предмет значений предложения where (т.е. zipId = 13458).Затем использует индекс для поиска соответствующих значений из основной таблицы MyISAM (второй доступ к диску).Когда вы загружаете таблицу в память, все обращения к диску осуществляются в памяти, а не с чтения реального диска.

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

Нужно попробовать Объяснить Выберите в своих запросах, чтобы увидеть, как используется индекс.

Редактировать : Поскольку я не думаю, что ответы на ваши комментарии будут помещаться в поле для комментариев.Я отвечу на них здесь.

MyISAM сам по себе не имеет кеша.Кэширование диска зависит от ОС.Сколько вашей таблицы кэшируется, зависит от того, что еще вы используете в системе, и сколько данных вы читаете.В частности, Windows не дает пользователю возможности контролировать, какие данные кэшируются и как долго.

Операционная система кэширует дисковые блоки (фрагменты 4K или 8K) файла индекса или файла полной таблицы.

SELECT indexed_col FROM tb1 WHERE zipId+0>1

Подобные запросы, когда вы используете функции предиката (предложение Where)) может заставить MySQL выполнять полное сканирование таблицы, а не использовать какой-либо индекс.Как я уже говорил выше, используйте EXPLAIN SELECT, чтобы увидеть, что делает MySQL.

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

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