您好我正在寻找确保唯一用户名的最高性能方式。 我确实已经检查了类似的问题,但没有一个让我开心。 所以我在这里提出了我的解决方案。感谢您的评论。
CREATE TABLE IF NOT EXISTS `user` (
`guid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`firstname` varchar(48) NOT NULL,
`lastname` varchar(48) NOT NULL,
`username` varchar(128) NOT NULL,
`unique_username` varchar(128) NOT NULL,
PRIMARY KEY (`guid`),
KEY `firstname` (`firstname`),
KEY `lastname` (`lastname`),
KEY `username` (`username`),
UNIQUE KEY `unique_username` (`unique_username`),
UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
username
包含firstname.lastname
,不含数字后缀,而unique_username
包含firstname.lastname.(count of equal usernames)
获取我在对用户表进行查询后执行的相同用户名的计数(提前插入)。
SELECT COUNT(*) FROM user WHERE username = 'username'
不幸的是,我不能对firstname and lastname
使用查找,因为它们区分大小写。
答案 0 :(得分:1)
The docs say“非二进制字符串(CHAR,VARCHAR,TEXT),字符串搜索使用比较操作数的排序规则...非二进制字符串比较默认情况下不区分大小写”,所以你应该能够这样做:
SELECT COUNT(*) FROM user WHERE CONCAT_WS('.', `firstname`, `lastname`) = 'username`
答案 1 :(得分:0)
为了解决大小写敏感问题,您可以使用LCASE(列)来比较小写值:
SELECT COUNT(*) FROM user
WHERE LCASE(lastname) = LCASE('Lastname')
AND LCASE(firstname) = LCASE('firstName');
您还可以使用LIKE检查用户名字段:
SELECT COUNT(*) FROM user WHERE username LIKE 'username%';
那样'this.name','this.name.1'和'this.name.2'都会被计算在一起。
我认为这两种解决方案都不会让优化器利用索引,因此性能可能会下降,但可能不是问题。