2010-11-25 2 views
0

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

после я бегу «ЗАГРУЗИТЬ INDEX INTO CACHE ТВ1» (key_buffer_size = 128M и общий индекс размер туберкулезу является 82M): 2. SELECT price,city,state FROM tb1 WHERE zipId=24781;
результат 23rows в 0.252s, Key_reads остается постоянной, Key_read_requests увеличивается с 23

BUT после того, как загрузить «zipId» в кэш ОС, если я запускаю снова запрос:
2. SELECT price,city,state FROM tb1 WHERE zipId=20548;
результат: 22rows in 0.006s

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

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

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

+0

Что такое дизайн стола? Ключевой кеш не будет быстрым, если используемый индекс не покрывает сипид, цену, город и состояние. Otherwize запрос читает индекс, а затем таблицу. – 2010-11-25 01:30:46

+0

@Thomas Jones-Low Индекс охватывает все 3 col. Я сделал несколько тестов, и это не имеет большого значения, если я выбираю 1 или 3 col. ИЛИ, если индексированные столбцы выделены или нет. – silversky 2010-11-25 02:01:09

ответ

0

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

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

Одна вещь, которую нужно попробовать: Explain Select в ваших запросах, чтобы узнать, как используется индекс.

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

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

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

SELECT indexed_col FROM tb1 WHERE zipId+0>1 

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

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

Смежные вопросы