[英]MySQL index performance… Should I create an index on this simple table?
[英]Why should I create a MySql table containing index only?
我正在關注Java Spring教程,以學習有關Web應用程序中安全登錄的一些基本信息。 在本教程中,作者創建了3個MySql表來管理身份驗證:
CREATE TABLE `roles` (
`id` int(6) NOT NULL AUTO_INCREMENT,
`role` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `users` (
`id` int(6) NOT NULL AUTO_INCREMENT,
`login` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `user_roles` (
`user_id` int(6) NOT NULL,
`role_id` int(6) NOT NULL,
KEY `user` (`user_id`),
KEY `role` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表“角色”包含用戶角色(例如“管理員”,“用戶”等)。 表“用戶”包含用戶登錄名和密碼。
所以,我不明白為什么創建了表“ user_roles”! “角色”和“用戶”之間的關系是一對一的,因此我可以為這兩個表插入索引並刪除“ user_roles” ...對嗎? 為什么我需要加入“用戶-> user_roles->角色”表而不是“用戶->角色”表?
提前致謝 :)
對於1:1關系,只有一張桌子。 (有例外,但我在這里看不到任何原因。)
如果你有很多users
在每一個role
,但一個user
只在一個role
,再加入role_id
到Users
表。 這是1:很多。 您可能需要INDEX(role_id)
。
如果一個user
可以有很多roles
而每個role
可以有很多users
,那么您需要很多:很多。 這將是編寫第三張表的最佳方法:
CREATE TABLE `user_roles` (
`user_id` int(6) NOT NULL,
`role_id` int(6) NOT NULL,
PRIMARY KEY (`user_id`, role_id),
KEY (`role_id`, user_id)
) ENGINE=InnoDB DEFAULT;
從某種意義上講,這是僅索引表,因為PRIMARY KEY
包含所有字段。
INT(6)
(6)
中的INT(6)
是沒有意義的。 特別是,它不會為您提供6位整數,但仍會為您提供最多20億個4字節有符號整數。 也許您應該使用MEDIUMINT UNSIGNED
作為0..16M的值。 或SMALLINT UNSIGNED
用於2字節值0..64K。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.