ИМХО Тебе не нужно физически его разбивать. Тем не менее, было бы неплохо его кешировать.
Если в users
таблице используется MyISAM Storage Engine, у вас есть хорошее преимущество.
Поскольку MyISAM кэширует только индексы, вы можете сделать две вещи
- Вы можете создать собственный кеш ключей, чтобы загрузить индекс MyISAM только для
users
таблицы.
- Вы можете индексировать имя пользователя и пароль, чтобы запрос попадал только в этот кеш пользовательских ключей.
Убедитесь, что следующие индексы существуют для users
ALTER TABLE users ADD UNIQUE INDEX username_ndx (username);
ALTER TABLE users ADD UNIQUE INDEX username_password_ndx (username,password);
Есть две (2) основные причины для двух индексов
ПРИЧИНА для индекса № 1
Индекс не username_ndx
позволяет имени пользователя иметь несколько паролей, а также запрещает нескольким пользователям с одним именем
ПРИЧИНА для индекса № 2
Индекс username_password_ndx
обеспечивает индекс покрытия . Таким образом, ваш запрос будет искать имя пользователя и пароль только в пользовательском кэше MyISAM вместо проверки таблицы.
Дополнительные ссылки на принципы покрытия индексов
Следующее, что нужно сделать, - создать этот кеш. Вот команды для создания 8 МБ кеша ключей и загрузки этого выделенного кеша ключей (пример: если таблица mydb.users
):
SET GLOBAL authentication_cache.key_buffer_size = 1024 * 1024 * 8;
CACHE INDEX mydb.users IN authentication_cache;
LOAD INDEX INTO CACHE mydb.users;
Вы должны поместить эти три строки в файл /var/lib/mysql/startup.sql
Добавьте это в /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/startup.sql
Это будет загружать кэш каждый раз при запуске mysql
Попробуйте!
ОБНОВЛЕНИЕ 2011-12-30 17:25 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Если вы хотите получить точный размер для установки кэша, используйте следующий запрос:
SELECT CONCAT('1024 * 1024 * ',ROUND(index_length/power(1024,2))) RecommendedCacheSize
FROM information_schema.tables WHERE table_name='users';
ОБНОВЛЕНИЕ 2011-12-30 23:21 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Вот метод, основанный на InnoDB
Вам все еще нужны индексы
ALTER TABLE users ADD UNIQUE INDEX username_ndx (username);
ALTER TABLE users ADD UNIQUE INDEX username_password_ndx (username,password);
Вы должны убедиться, что в пуле буферов InnoDB есть имена пользователей и пароли. Возможно, вам придется прибегнуть к полному сканированию индекса при запуске mysql:
Шаг 1) Создайте ReadUserPass.sql
echo "select username,password from users;" > /var/lib/mysql/ReadUserPass.sql
Шаг 2) Добавьте этот скрипт в /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/ReadUserPass.sql
Шаг 3) Выполните одно из следующих
$ service mysql restart
mysql> source /var/lib/mysql/ReadUserPass.sql
Поскольку оба эти столбца (имя пользователя и пароль) находятся в username_password_ndx
, все страницы индекса, составляющие этот индекс, перезагружаются в пул буферов InnoDB. Это необходимо, потому что существует возможность удаления страниц индекса. Чтобы свести к минимуму это, увеличьте размер пула буферов и перезапустите mysql (один раз).