卢涛:以MySQL技能征服百万级数据,0.89秒的惊艳表现
数据库编程大赛:一条SQL计算扑克牌24点
参赛选手:卢涛选手简介:ITPUB Oracle开发版版主参赛数据库:MySQL性能评测:百万级数据代码性能评测 0.89秒综合得分:85.8以下是卢涛选手的代码说明思路简介:1. 采取查表法,预先用其他方法((grubbyoo 编写的SQL ,552条6秒) (C语言566条0.3秒))生成4个数四则运算能算出24点的组合,包括点数从小到大排序拼接成字符串和输出结果,把它保存在SQL的CTE表中备查。2. 为了解决采用拼接union select或values()的长度超过10K字节限制的问题,主要采取了压缩空间的技巧。3. 解决测试数据和已知结论对应关系。cards表包含数字1到10的全排列,共10000种。
4. 接下来的优化点主要在于建立更高效的关联字段。
以下是卢涛选手的算法说明,结尾附完整SQL:
算法说明
4个数四则运算能算出24点的组合:(一共有566种)
1118:(1+1+1)*8=24
1126:(1+1+2)*6=24
1127:(1+2)*(1+7)=24
1128:(1*1+2)*8=24
1129:(1+2)*(9-1)=24
11210:(1+1)*(2+10)=24
'1118:(1+1+1)*8')),((
'1126:(1+1+2)*6')),((
'1127:(1+2)*(1+7)')),((
'1128:(1*1+2)*8')),((
'1129:(1+2)*(9-1)')),((
'11210:(1+1)*(2+10)'))
(select
'1118(1+1+1)*8,1126(1+1+2)*6,1127(1+2)*(1+7),1128(1*1+2)*8,1129(1+2)*(9-1),,88808-(8-0)*8,'
st)
,a1
as(
select 1 n, substr(st,1,instr(st,',')-1) s,instr(st,',')+1 p from st
union all
select n+1 ,substr(st,p,regexp_instr(st,',',p)-p),regexp_instr(st,',',p)+1 from a1,st where npython 24ev2.txt
8/(3-8/3) #经检验,是小数运算误差,不是错误
D:>python
>>> 8/(3-8/3)
23.99999999999999