IMHO物理的に分割する必要はありません。しかし、それをキャッシュしておくとよいでしょう。
users
テーブルがMyISAMストレージエンジンを使用している場合、大きな利点があります。
MyISAMはインデックスのみをキャッシュするため、2つのことを行うことができます
users
テーブルのみのMyISAMインデックスをロードするためだけにカスタムキーキャッシュを作成できます
- ユーザー名とパスワードにインデックスを付けて、クエリにそのカスタムキーキャッシュのみをヒットさせることができます
次のインデックスが存在することを確認してください users
ALTER TABLE users ADD UNIQUE INDEX username_ndx (username);
ALTER TABLE users ADD UNIQUE INDEX username_password_ndx (username,password);
2つのインデックスには2つの主な理由があります。
インデックス#1の理由
インデックスusername_ndx
は、ユーザー名が複数のパスワードを持つことを防ぎ、同じ名前の複数のユーザーを防ぐ
インデックス#2の理由
インデックスusername_password_ndx
はカバーするインデックスを提供します。したがって、クエリは、テーブルをチェックするのではなく、カスタムMyISAMキャッシュのみでユーザー名とパスワードを検索します。
カバリングインデックスの原則に関するその他のリンク
次に、実際にそのカスタムキーキャッシュを作成します。以下は、8MBのキーキャッシュを作成し、その専用キーキャッシュをロードするコマンドです(例:テーブルがの場合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;
これらの3行をファイル/var/lib/mysql/startup.sqlに配置する必要があります
これを/etc/my.cnfに追加します
[mysqld]
init-file=/var/lib/mysql/startup.sql
これは、mysqlが起動するたびにキャッシュをロードします
試してみる !!!
UPDATE 2011-12-30 17:25 EDT
正確なサイズを取得してキャッシュを設定する場合は、次のクエリを使用します。
SELECT CONCAT('1024 * 1024 * ',ROUND(index_length/power(1024,2))) RecommendedCacheSize
FROM information_schema.tables WHERE table_name='users';
UPDATE 2011-12-30 23:21 EDT
これは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を再起動します(1回限り)。