mysql创建索引需要注意啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql创建索引需要注意啥相关的知识,希望对你有一定的参考价值。

参考技术A 创建索引的目的在于提高查询效率,但也要注意:

首先,索引能大大提高了查询速度,但同时却会降低更新表的速度,如对表进行INSERT,UPDATE和DELETE。因为更新表时,mysql不仅要保存数据,还要保存一下索引文件。

其次,建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在要给大表上建了多种组合索引,索引文件会膨胀很宽。

MySQL 数据库中可搜索的 userName 列使用啥数据类型和索引?

【中文标题】MySQL 数据库中可搜索的 userName 列使用啥数据类型和索引?【英文标题】:What data type and index to use for a searchable userName column in a MySQL database?MySQL 数据库中可搜索的 userName 列使用什么数据类型和索引? 【发布时间】:2018-08-11 11:37:38 【问题描述】:

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

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

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

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

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

【问题讨论】:

您认为要存储多少用户数.. ??' 如果一切顺利,大约 15-20 百万,只是为了做好准备 没有明显的优势.. 对于索引的种类,取决于您将使用什么来搜索:如果它是 99.9% 情况下字符串的开头,则为 BTree。如果您每次都搜索*pattern*,那么BTree 甚至都不会被使用... 不,如果你想要这样的模式 %LIKE%,索引是从字符串的开头到结尾 【参考方案1】:
username VARCHAR(40) CHARACTER SET utf8mb4 NOT NULL

INDEX(username)

WHERE username = 'some_username'

这是唯一理智的答案。您最多需要 40 个 UTF-8 字符。用户将只搜索全名,而不搜索部分内容(LIKEFULLTEXT 等)。你需要索引,所以不用担心它比INT效率略低。

一种可能的变体:您可能希望username 成为某个表中的PRIMARY KEY(而不是“次要”INDEX)。

【讨论】:

【参考方案2】:

Char vs Varchar

当您有固定长度时,Char 很有用,例如产品参考或 ISO-* 字段。为什么 ?因为它会让你不用在每一行都使用 length byte

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

绝对是 Varchar。


索引 BTree 与全文

接下来,索引。如前所述,这取决于您将进行哪种搜索。

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

对于只做LIKE '%pattern%'在字符串中搜索部分子字符串的搜索,那么,你真的什么都没有。

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

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

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

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

如何最好地使用它?

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

改进:

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

【讨论】:

以上是关于mysql创建索引需要注意啥的主要内容,如果未能解决你的问题,请参考以下文章

牛B程序员在“创建索引”时都会注意啥?

mysql有那些索引?分别在啥场景使用

创建了MySQL全文索引之后,使用啥命令可以知道是不是创建成功了

数据存储-1MySQL 索引使用的注意事项

关于mysql的索引及原理

关于mysql的索引及原理