MySQL 用户名、密码的多列索引
MySQL multiple-column indexes on username, password
在我必须维护的 MySQL 数据库中 我有这个 table 和两个索引
CREATE TABLE users (
id INTEGER UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
-- some attributes
nickname VARCHAR (20) NOT NULL UNIQUE,
password VARCHAR (20) NOT NULL,
-- other attributes
PRIMARY KEY (id),
INDEX auth (nickname, password),
INDEX region_id (region)
);
我的问题是关于 auth
索引。它是一个多列索引,但是由于 nickname
是 UNIQUE
,所以 password
不是多余的吗?为什么 nickname
和 password
都有索引?为什么不只是 nickname
因为它是 UNIQUE
?
仅当您要通过索引字段进行搜索时才需要索引。
我认为只有在昵称字段已经是唯一的情况下才创建索引更好。
但请确保您始终在 where 子句中使用昵称字段或在密码字段之前首先加入。
例如其中昵称 = 'somevalue' 和密码 = 'somepassword'。这将加速查询并减少查询结果获取时间。
有了这个两列索引mysql可以运行查询鉴权(没有select数据的,只有id
或者count(id)
通过用户名和密码)而不实际访问 table 中的数据,仅通过索引本身,这是最快的
在我必须维护的 MySQL 数据库中 我有这个 table 和两个索引
CREATE TABLE users (
id INTEGER UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
-- some attributes
nickname VARCHAR (20) NOT NULL UNIQUE,
password VARCHAR (20) NOT NULL,
-- other attributes
PRIMARY KEY (id),
INDEX auth (nickname, password),
INDEX region_id (region)
);
我的问题是关于 auth
索引。它是一个多列索引,但是由于 nickname
是 UNIQUE
,所以 password
不是多余的吗?为什么 nickname
和 password
都有索引?为什么不只是 nickname
因为它是 UNIQUE
?
仅当您要通过索引字段进行搜索时才需要索引。
我认为只有在昵称字段已经是唯一的情况下才创建索引更好。
但请确保您始终在 where 子句中使用昵称字段或在密码字段之前首先加入。
例如其中昵称 = 'somevalue' 和密码 = 'somepassword'。这将加速查询并减少查询结果获取时间。
有了这个两列索引mysql可以运行查询鉴权(没有select数据的,只有id
或者count(id)
通过用户名和密码)而不实际访问 table 中的数据,仅通过索引本身,这是最快的