varchar && bigint 执行效率及区别
在数据库表设计的过程中,总会遇到某个字段到底使用何种类型的困惑?比如身份证(举例不当,因为身份证会出现字母的情况)11位,我如果使用int类型的话,肯定不行,个数都超额了;所以一般采用的办法就是使用varchar,自定义使用长度,很好的办法。不过最近发了bigInt的使用,下边通过测试来对比一下两者的性能使用情况:(最新测试往下拉)
第一次测试:
第一种情况:idcardno为varchar类型的时候
查询整体使用的耗时:
如图:执行时间0.001sec
查询idcardno为1304300,sql语句-SELECT * FROM id_logs WHERE idcardno=“1304300”
查询idcardno为1304300和id为31,sql语句-SELECT * FROM id_logs WHERE idcardno=“1304300” AND id=“31”
第二种情况:idcardno为bigint类型的时候
查询整体使用的耗时:
查询idcardno为1304300,sql语句-SELECT * FROM id_logs WHERE idcardno=“1304300”
查询idcardno为1304300和id为31,sql语句-SELECT * FROM id_logs WHERE idcardno=“1304300” AND id=“31”
具体使用时长表格对比:
Tables | VARCHAR | BIGINT |
---|---|---|
查询所有 | 0.001 | 0.099 |
idcardno为定值 | 0.003 | 1.486 |
idcardno和id为定值 | 1.543 | 1.486 |
2018年09月12日重新测试:
条件一:
测试工具:macbook pro 8G
测试环境:30万条数据 为字段UID加了唯一索引
当设置uid为VARCHAR类型,执行一条查询数据:
执行SQL:select * from employees where uid=10017000000001;
执行结果:
当设置uid为BIGINT类型,执行一条查询语句:
执行SQL:select * from employees where uid=10017000000001;
执行结果:
条件二:
测试工具:macbook pro 8G
测试环境:60万条数据 为字段UID加了唯一索引
VARCHAR类型下,执行语句
查询条件无引号:select * from employees where uid=10017000000001;
执行结果:
explain执行计划结果:
查询条件加单引号:select * from employees where uid=‘10017000000001’;
执行结果:
explain执行计划结果:
BIGINT类型下,执行语句
查询语句:select * from employees where uid=‘10017000000001’;
explain执行计划结果:
如上实践结果分析:
type | condition | result | explain |
---|---|---|---|
VARCHAR | 加单引号查询:uid=‘10017000000001’ | 5.5ms | type=ref,rows=1索引生效 |
VARCHAR | uid=10017000000001 | 261ms | type=All,rows=597558,索引失效 |
BIGINT | uid=10017000000001 | 2.3ms | type=ref,rows=1索引生效 |
根据结果我们可以清晰的看到,若使用VARCHAR作为查询类型,我们必须加上引号执行,索引才会生效;
所以对于索引,一定要注意:
如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。
具体见文章mysql索引应用