我有一张包含百万条记录的“交易”表
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_string
和secret_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
目前不存在,但如果通过它搜索记录的速度更快,我计划在插入行时创建它。
谢谢
我希望我有道理。
答案 0 :(得分:1)
Int比较比varchar比较更快,因为ints占用的空间比varchars少得多。
对于无索引和索引访问都适用。最快的方法是索引的int列。
使用int还有另一个原因,那就是规范化数据库。而不是文本' 52987624f7cb03c61d403b7c68502fb0'在表中存储了数千次,你应该存储它的id并将秘密字符串存储在一个单独的表中。对于其他操作,例如SUM COUNT AVG,它也是同样的交易。
答案 1 :(得分:-1)
正如其他人告诉你的那样:选择int肯定比字符串更快。但是,如果需要通过secret_string进行选择,则所有给定的字符串看起来都像十六进制字符串,表示您可以考虑使用hex('52987624f7cb03c61d403b7c68502fb0')
将这些字符串强制转换为int(或大型int)并存储这些int值而不是字符串< / p>