在mysql中按列整数或列字符串搜索更快吗?

时间:2017-04-08 20:03:03

标签: mysql

我有一张包含百万条记录的“交易”表

id        trx   secret_string (varchar(50))        secret_id (int(2.))
1         80    52987624f7cb03c61d403b7c68502fb0   1
2         28    52987624f7cb03c61d403b7c68502fb0   1
3         55    8502fb052987624f61d403b7c67cb03c   2
4         61    52987624f7cb03c61d403b7c68502fb0   1
5         39    8502fb052987624f61d403b7c67cb03c   2
..
999997    27    8502fb052987624f61d403b7c67cb03c   2
999998    94    8502fb052987624f61d403b7c67cb03c   2
999999    40    52987624f7cb03c61d403b7c68502fb0   1
1000000   35    8502fb052987624f61d403b7c67cb03c   2

您可以注意到,secret_stringsecret_id将始终匹配。

让我们说,我需要选择secret_string = "52987624f7cb03c61d403b7c68502fb0"的记录。

做得更快:

SELECT id FROM transactions WHERE secret_id = 1

比:

SELECT id FROM transactions WHERE secret_string = "52987624f7cb03c61d403b7c68502fb0"

或者没关系?如SUM(trx)COUNT(trx)AVG(trx)等其他操作呢?

secret_id目前不存在,但如果通过它搜索记录的速度更快,我计划在插入行时创建它。

谢谢

我希望我有道理。

2 个答案:

答案 0 :(得分:1)

Int比较比varchar比较更快,因为ints占用的空间比varchars少得多。

对于无索引和索引访问都适用。最快的方法是索引的int列。

使用int还有另一个原因,那就是规范化数据库。而不是文本' 52987624f7cb03c61d403b7c68502fb0'在表中存储了数千次,你应该存储它的id并将秘密字符串存储在一个单独的表中。对于其他操作,例如SUM COUNT AVG,它也是同样的交易。

答案 1 :(得分:-1)

正如其他人告诉你的那样:选择int肯定比字符串更快。但是,如果需要通过secret_string进行选择,则所有给定的字符串看起来都像十六进制字符串,表示您可以考虑使用hex('52987624f7cb03c61d403b7c68502fb0')将这些字符串强制转换为int(或大型int)并存储这些int值而不是字符串< / p>