偶然的机会,得知mysql主键的类型采用 varchar 存UUID 的查询性能没有int型作主键好。网上查询大量资料,都是停留在理论上的,所以,本身写了代码进行实测,如下结果仅供参考,不具有权威性。mysql
三个表的字段,除了主键ID 分别采用varchar,bigint 和自动增加bigint不一样外,其余三个字段都为 varchar 36位sql
数据库:mysql5.5数据库
表类型:InnoDB服务器
数据量:100W条oracle
第一种状况:性能
主键采用uuid 32位。测试
运行查询语句1:SELECT COUNT(id) FROM test_varchar;ui
运行查询语句2:SELECT * FROM test_varchar WHERE vname='00004629-b052-11e1-96aa-002655b28d7b';设计
运行查询语句3:SELECT * FROM test_varchar WHERE id='00004599b05211e196aa002655b28d7b';开发
语句1消耗时间平均为:2.7秒;
语句2消耗时间平均为:3秒;
语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间彻底同样,毫秒级都为000)
第二种状况:
主键采用bigint,使用uuid_short()产生数据,数据为有序列的纯数字(22461015967875697)。(其至关于自动增加,只是固定的基数值较大而已。)
运行查询语句1:SELECT COUNT(id) FROM test_long;
运行查询语句2:SELECT * FROM test_long WHERE vname='d7f28a24-b053-11e1-96aa-002655b28d7b';
运行查询语句3:SELECT * FROM test_long WHERE id='22461015967875702';
语句1消耗时间平均为:1.2秒;
语句2消耗时间平均为:1.40秒;
语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间彻底同样,毫秒级都为000)
第三种状况:
运行查询语句1:SELECT COUNT(id) FROM test_int;
运行查询语句2:SELECT * FROM test_int WHERE vname='c80f8427-b059-11e1-96aa-002655b28d7b';
运行查询语句3:SELECT * FROM test_int WHERE id=900000;
主键采用mysql自带的自动增加,数据为纯数字(1,2,3,4,5……)。
查询语句1消耗时间平均为:1.07秒;
查询语句2消耗时间平均为:1.31秒;
查询语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间彻底同样,毫秒级都为000)
总结:因而可知,mysql InnoDB 主键采用自动增加性能较高。
笔者自语:平时的项目开发,sql语句的条件里有ID的,占多数,没有的占少数。虽然以上的测试代表只要条件语句里有主键ID,主键类型不同,查询时间彻底同样。可是,你不能保证你的项目中全部sql语句的条件里都有ID,所以…………主键的类型该采用哪一种,相信各位看官已经明白。
---------------------------------------------------------华丽的分割线----------------------------------------------------------
数据库:mysql5.5
表类型:MyISAM
数据量:100W条
为了少写一些字,节省时间,此测试所使用的表和sql语句同上,此处只记录消耗时间。
第一种状况:
主键采用uuid 32位。
语句1消耗时间平均为:0秒;
语句2消耗时间平均为:0.53秒;
语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间彻底同样,毫秒级都为000)
第二种状况:
主键采用bigint,使用uuid_short()产生数据,数据为有序列的纯数字(22461015967875697)。(其至关于自动增加,只是固定的基数值较大而已。)
语句1消耗时间平均为:0秒;
语句2消耗时间平均为:0.51秒;
语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间彻底同样,毫秒级都为000)
第三种状况:
主键采用mysql自带的自动增加,数据为纯数字(1,2,3,4,5……)。
语句1消耗时间平均为:0秒;
语句2消耗时间平均为:0.48秒;
语句3消耗时间平均为:0秒;(多方测试,条件里只要有主键ID,查询速度毫秒级都显示000。测试的ID值,有前一百条的,也有后90多万条的。查询时间彻底同样,毫秒级都为000)
总结:因而可知,mysql MyISAM 主键采用自动增加性能比其余有微弱的优点。测试数据为100w,若是是1000W 1亿,我想这个优点会拉大,若是你还有外键关联查询,这个优点就更明显了。固然,若是你设计的系统,数据量尚未超过100W,你用啥主键类型都无所谓。我测试电脑是笔记本,若是是专业的服务器,估计100W条,mysql MyISAM 的这些测试,根本都测不出来时间差。
大总结:原本是要测mysql主键类型不一样,查询效率的差异的,怎么写到最后,感受像是在测mysql InnoDB和MyISAM的优劣了,无限纠结中……,有时间测下oracle!!