一个SQL查询优化问题

归海一刀 发布于 2013/09/01 15:09
阅读 907
收藏 1

有一张数据表(company_table)存放企业基本信息,约有记录 150W

主要字段

id(主键,自增) company_name company_other_info
1 XXX科技有限公司 ……
2 XXX公司 ……
……
XXX ……
1500000 XXX股份有限公司 ……

由于其它一些原因ID展示在前台不安全,因些将ID进行了MD5加密(当然可以使用可解密的方案,因为是讨论这个SQL问题,所以暂时先不考虑)处理,查询时要根据加密后的MD5值去数据库中取数据,当前使用的SQL语句如下:

select * from `company_table` where md5(id)='d8f16897e8528297710d4f26259bfef8'
很明显这种查询执行的速度相当慢,请问各位大牛,如何优化这类查询?

加载中
0
魔力猫
魔力猫

我很奇怪你们居然会有主键ID显示出来不安全的事情,不过就是一串数字而已,难道你们给予了特殊的意义?

新建一个字段,在字段里存储计算后的MD5,日后去查询主键其实是去查这个新字段就是。

0
魔力猫
魔力猫
或者函数索引也可以考虑。
魔力猫
魔力猫
回复 @xiaochong0302 : 抱歉没看清楚分类。
小虫0302
小虫0302
mysql不支持函数索引吧
0
归海一刀
归海一刀

引用来自“魔力猫”的答案

我很奇怪你们居然会有主键ID显示出来不安全的事情,不过就是一串数字而已,难道你们给予了特殊的意义?

新建一个字段,在字段里存储计算后的MD5,日后去查询主键其实是去查这个新字段就是。

这是一个解决方案,也是我目前想到的相对比较好的解决方案,提这个问题是看看大家伙有什么优化方案没,别不是无理取闹。
0
ForEleven
ForEleven

这个明显想复杂了,就算你md5 处理id以后,不还是一个字符串。如果你项目所有跟这张表查询的地方都是这样md5以后查。那么跟直接使用id,不是一回事了。

0
菜根乱谭
菜根乱谭

我现在的做法是直接采用uuid或者其他字符串(无规律)作为主键,如果要减少空间,提升索引的效率,可以采用int作为id,再生成一个字符串的备用id,备用id就用在你认为需要安全不能暴露int主键的地方使用。

直接用md5(id)因为无法利用主键的索引,故效率太慢,还是用冗余来做吧。

0
归海一刀
归海一刀

引用来自“谭明智”的答案

我现在的做法是直接采用uuid或者其他字符串(无规律)作为主键,如果要减少空间,提升索引的效率,可以采用int作为id,再生成一个字符串的备用id,备用id就用在你认为需要安全不能暴露int主键的地方使用。

直接用md5(id)因为无法利用主键的索引,故效率太慢,还是用冗余来做吧。

嗯,看来只有这种解决方案了。
0
我已经报警了
我已经报警了
...我真是跪了,你加密个1-150w数字的md5,有意义?反差还不到一秒钟
0
mark35
mark35

引用来自“魔力猫”的答案

或者函数索引也可以考虑。
mysql不支持函数索引。如果是pgsql那么直接创建一个md5(id)的函数索引即可
0
华兹格
华兹格
把这个id 隐藏起来不可以吗?
0
jerri
jerri
冗余字段吧,在不影响安全的前提下
返回顶部
顶部