MySQL索引到底使用int还是varchar

MySQL索引到底使用int还是varchar?

这个问题就牵涉到利用索引存储数据方式的问题了
我们都知道,MySQL默认使用InnoDB存储引擎,创建索引时底层使用的是B+Tree,通常B+Tree一共有3层或者4层。如下图所示:

MySQL索引到底使用int还是varchar_第1张图片
假如是三层B+Treee,假如每层能容纳16kb。 每一对指针pkey占了10个字节,每个data占了1kb,那么这个B+Tree到底能存储多少条数据呢?
答案就是:
第一层:16 * 1024/10
第二层:16 * 1024/10
第三层:16/1
最终就是:16 * 1024/10 * 16 * 1024/10 * 16/1≈4.2 * 10^8条数据,
这个数据量已经很大了,因此大部分情况,3层B+Tree就足够了。

另外由图可知:第一层和第二层是不存放data的。因此想要增加存储的数据条数,就要减少key占的空间

回到正题:MySQL索引到底使用int还是varchar?

首先补充一下知识:

  • int:从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节(注意:这是固定的)。

    • 无论是int(3), int(6), 都可以显示6位以上的整数。但是,当数字不足3位或6位时,前面会用0补齐。也就是说,int的长度并不影响数据的存储精度,长度只和显示有关,为了让大家看的更清楚。
      具体见:https://blog.csdn.net/xcymorningsun/article/details/73105691
  • varchar:首先 mysql 5.X 以上的版本的 定义中 表示的字符长度,如上varchar(20)你既可以添加20个英文字符,也可以添加二十个中文字符。 表示的字符长度。

哈哈,那么是时候说下答案了:
就是看 若用varchar表示它的长度是多少个字节,如果你的varchar小于4个字节,那么就用varchar,如果varchar大于4个字节,那么就用int。

你可能感兴趣的:(数据库)