基于mysql的版本号比较

需求是根据APP设备类型+版本号,查找满足条件的记录返回。

问题

数据库的每一行有start_version和end_version字段,记录了其生效的版本号范围。

假设:有一条记录start_version是9.3.25,end_version是10.0.1, APP版本号是9.13.2,是满足版本范围的。

但是如果我们直接用SQL:where 9.13.2 >= start_version and 9.13.2 <= end_version,那么将无法匹配得到记录。

这是因为9.13.2与9.3.25在MYSQL中是逐字符比较的,1小于3所以匹配失败,实际应该判定13大于3。

解决

解决方法就是补齐前导0,新建padding_start_version字段值为0009.0003.0025.0000,新建padding_end_version字段设置为0010.0000.0001.0000。

当客户端请求device_type=1,version=9.13.2的时候,经过补齐version为0009.0013.0002.0000,然后执行SQL过滤:where device_type=1 and 0009.0013.0002.0000>=padding_start_version and 0009.0013.0002.0000<=padding_end_version,此时匹配可以成功。

索引

这里索引建成device_type+padding_start_version或者device_type+padding_end_version都可以(具体看业务场景)。

但是device_type+padding_start_version+padding_end_version的三者联合索引是没意义的,我们从B+树的有序性以及where条件的搜索目标即可分析出索引怎么建是最有效最必要的,另外也可以直接记住准则:mysql一旦遇到范围查询就会忽略后续的字段索引,因此只会用到上面红色的部分走索引。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~