私は現在、このスキーマを持っている:MySQLのクエリのパフォーマンスのジレンマ:テーブル対列挙
CREATE TABLE `users` (
`users_id` int(11) NOT NULL AUTO_INCREMENT,
`users_name` varchar(50),
`users_lastname` varchar(50),
`users_dob` date,
`users_type` int(11) NOT NULL default 0,
`users_access` int(11) NOT NULL default 0,
`users_level` int(11) NOT NULL default 0,
/* etc...*/
PRIMARY KEY (`users_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `users_types` (
`types_id` int(11) NOT NULL AUTO_INCREMENT,
`types_name` varchar(50),
PRIMARY KEY (`types_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/* etc..*/
問合せ:
SELECT
types_name AS user_type,
/* all other fields*/
users.*
FROM users
INNER JOIN users_types ON (users.users_type=types_id);
/* INNER JOIN for all other tables*/
/* Rest of query */
私の新しいソリューション:
CREATE TABLE `users` (
`users_id` int(11) NOT NULL AUTO_INCREMENT,
`users_name` varchar(50),
`users_lastname` varchar(50),
`users_dob` date,
`users_type` ENUM('type1', 'type2', 'type3'),
`users_access` ENUM('access1', 'access2', 'access3'),
`users_level` ENUM('level1', 'level2', 'level3'),
/* etc...*/
PRIMARY KEY (`users_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
問合せ:
SELECT
*
FROM users
ENUMを使用していることから、ENUMは非常に簡単で実行が非常に簡単です。
- 私は正しいですか? LEFT JOINを持つのではなく、MySQLエンジンがENUM型フィールドを処理する方が速いでしょうか?
- ENUMを使用していますか? ENUMデータ型をテーブル自体に各レコードの別のテーブルを読み取る(すなわち不要)
2)はい(Y)をインデックス付けされないよう
おかげ
列挙型リストが変更される場合、テーブルは良好です。これは単純な挿入/更新クエリです。列挙型にはalter tableが必要です。 –
ルックアップタイプの符号付き整数(4バイト)は少し過剰です - 符号なしタイニーイントはどうですか? –
私はunsigned intを使うべきですか?私は200,000人以上のユーザーを持っています – Tech4Wilco