mysql - MySQL 数据库中可搜索的用户名列使用什么数据类型和索引?

标签 mysql sql database-design sqldatatypes database-indexes

我有一个 MySQL 数据库,它有一个名为 user 的 InnoDB 表。

每个用户在创建帐户时都需要创建一个用户名。用户名的长度只能在 1 到 40 个字符 (utf-8) 之间。此用户名的用途是允许一个用户搜索另一个用户。

问题是我不确定用户名使用什么数据类型。由于用户名的长度可变,Varchar 似乎很合适,但我不确定在 Varchar 上索引和搜索的速度有多快。我的想法是,因为我知道最大字符长度,所以我可以使用 Char(40) 代替。尽管这会由于填充而浪费一些空间,但我认为它会使索引和搜索更快、更高效,因为它是固定长度的。

我不确定的另一方面是我是否应该为该用户名列使用 Fulltext 索引或 BTree 索引。或者,如果有其他我不知道的索引方法会更好。

那么,哪种数据类型与哪种索引相关,可以为我提供最好、最快和最具可扩展性的解决方案?

最佳答案

Char 与 Varchar

Char 在长度固定时很有用,例如产品引用或 ISO-* 字段。为什么 ?因为它会让你在每一行都免于使用一个长度字节

但在您的情况下,名称绝不会超过 20 个字符,因此为了节省一个字节,您将在 75% 的记录中刻录超过 20 个:这不是好方法。

当然是 Varchar。


索引 BTree 与全文

接下来是索引。如前所述,这取决于您要执行的搜索类型。

对于使用 ='pattern'LIKE 'pattern%' 的搜索,BTree 索引确实是最好的。

对于仅执行 LIKE '%pattern%' 以搜索字符串中的部分子字符串 的搜索,那么,您实际上什么都没有。

你能做的最好的事情就是拥有一个只映射 id = name 的“小”表,在上面进行搜索并希望 mysql 将它保存在 RAM 中以进行顺序读取。

最后,您谈到了全文索引:该索引最适合匹配文本中的单词或单词请求,因此对您来说可能与 BTree 的结果相同。

那么,最好的方法是什么?

可能是 BTree 索引。是的,您不会覆盖单词内的搜索,但在大多数情况下就足够了。

如何最好地使用它?

  • 使用 LIKE 'pattern%' 运行第一次搜索
  • 你有结果吗?那么这可能就是用户想要的
  • 没有?选择慢得多的 LIKE '%pattern%'

改进:

  • 允许用户检查直接进入第二次搜索的“内部词”修饰符
  • 为第一个查询修复最少的行数以避免第二个而不仅仅是严格的 0 结果

关于mysql - MySQL 数据库中可搜索的用户名列使用什么数据类型和索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49082951/

相关文章:

mysql - Android应用程序的数据库设计

json - REST API 的数据库列命名

mySQL GROUP_CONCAT IN JOIN

mysql - 通过新的 wpdb 更改数据库后使用 wp_query

mysql - 使用通配符选择以特定字符开头的名称不起作用

sql:行的值作为列

mysql - 如何在 Bluemix 上运行 Spring MVC 项目?

mysql - 保存安全摄像头流

sql - PL/SQL - Oracle 9.1

database-design - 彼此之间具有 N2N 关系的两个实体的组成之间的关系