Предположим, у меня на сайте есть таблица пользователей, в которой около 2-3 миллионов пользователей (записей).
Для ускорения процесса входа в систему, это хороший способ разделить мою таблицу пользователей, одну для их информации и одну для их входа.
Если мы можем запустить запрос, аналогичный приведенному ниже, из одной таблицы:
select username,password from users where username=`test` AND password=****
Необходимо ли разделить его, и ускоряет ли это процесс входа в систему моего сайта?
Ответы:
ИМХО Тебе не нужно физически его разбивать. Тем не менее, было бы неплохо его кешировать.
Если в
users
таблице используется MyISAM Storage Engine, у вас есть хорошее преимущество.Поскольку MyISAM кэширует только индексы, вы можете сделать две вещи
users
таблицы.Убедитесь, что следующие индексы существуют для
users
Есть две (2) основные причины для двух индексов
ПРИЧИНА для индекса № 1
Индекс не
username_ndx
позволяет имени пользователя иметь несколько паролей, а также запрещает нескольким пользователям с одним именемПРИЧИНА для индекса № 2
Индекс
username_password_ndx
обеспечивает индекс покрытия . Таким образом, ваш запрос будет искать имя пользователя и пароль только в пользовательском кэше MyISAM вместо проверки таблицы.Дополнительные ссылки на принципы покрытия индексов
Следующее, что нужно сделать, - создать этот кеш. Вот команды для создания 8 МБ кеша ключей и загрузки этого выделенного кеша ключей (пример: если таблица
mydb.users
):Вы должны поместить эти три строки в файл /var/lib/mysql/startup.sql
Добавьте это в /etc/my.cnf
Это будет загружать кэш каждый раз при запуске mysql
Попробуйте!
ОБНОВЛЕНИЕ 2011-12-30 17:25 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Если вы хотите получить точный размер для установки кэша, используйте следующий запрос:
ОБНОВЛЕНИЕ 2011-12-30 23:21 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Вот метод, основанный на InnoDB
Вам все еще нужны индексы
Вы должны убедиться, что в пуле буферов InnoDB есть имена пользователей и пароли. Возможно, вам придется прибегнуть к полному сканированию индекса при запуске mysql:
Шаг 1) Создайте ReadUserPass.sql
Шаг 2) Добавьте этот скрипт в /etc/my.cnf
Шаг 3) Выполните одно из следующих
$ service mysql restart
mysql> source /var/lib/mysql/ReadUserPass.sql
Поскольку оба эти столбца (имя пользователя и пароль) находятся в
username_password_ndx
, все страницы индекса, составляющие этот индекс, перезагружаются в пул буферов InnoDB. Это необходимо, потому что существует возможность удаления страниц индекса. Чтобы свести к минимуму это, увеличьте размер пула буферов и перезапустите mysql (один раз).источник
users
таблица участвует в транзакциях, то мне нужно отправить другой ответ, основанный исключительно на InnoDB.Таблица из нескольких миллионов строк не должна быть разделена. Настройка производительности должна выполняться с помощью индексов. В MySpace были сотни миллионов учетных записей, перечисленных в одной таблице, и производительность на этой таблице была просто отличной. (Я был администратором баз данных для MySpace на пике их использования.) Таблица в этом случае была, вероятно, шириной 80-90 байт (может быть, немного больше).
источник
У вас есть 2 миллиона пользователей? Если у вас уже нет этой проблемы или вы не уверены, что она у вас возникнет, вы оптимизируете ее заранее. Добавьте составной индекс в поля логина и пароля и покончите с этим. Не оптимизируйте, если вы не знаете, что на самом деле есть проблема, которую нужно решить. Я уверен, что у вас есть большие проблемы, которые нужно решить.
источник
Если вы используете Mysql 5.1 и выше, вы можете попробовать разбить таблицу на части.
Что касается вашего вопроса о том, ускоряет ли он процесс входа в систему, это зависит от того, как выглядит оставшаяся часть процедуры входа в систему (например, если ваш запрос теперь занимает 0,05 секунды, а остальная часть кода занимает 20 секунд, я бы предпочел повторно думаю вся рутина ...).
Кроме того, независимо от использования разделов, не забудьте добавить индексы, как указал RolandoMySQLDBA .
источник