游戏湿太|怎么快速查询?,面试官:一千万数据( 二 )
SELECTcount(1)FROM`user_operation_log`返回结果:3148000
三次查询时间分别为:
14060ms13755ms13447ms普通分页查询
MySQL支持LIMIT语句来选取指定的条数数据 , Oracle可以使用ROWNUM来选取 。
MySQL分页查询语法如下:
SELECT*FROMtableLIMIT[offset,]rows|rowsOFFSEToffset第一个参数指定第一个返回记录行的偏移量第二个参数指定返回记录行的最大数目下面我们开始测试查询结果:
SELECT*FROM`user_operation_log`LIMIT10000,10查询3次时间分别为:
59ms49ms50ms这样看起来速度还行 , 不过是本地数据库 , 速度自然快点 。
换个角度来测试
相同偏移量 , 不同数据量
SELECT*FROM`user_operation_log`LIMIT10000,10SELECT*FROM`user_operation_log`LIMIT10000,100SELECT*FROM`user_operation_log`LIMIT10000,1000SELECT*FROM`user_operation_log`LIMIT10000,10000SELECT*FROM`user_operation_log`LIMIT10000,100000SELECT*FROM`user_operation_log`LIMIT10000,1000000查询时间如下:
文章图片
从上面结果可以得出结束:数据量越大 , 花费时间越长
相同数据量 , 不同偏移量
SELECT*FROM`user_operation_log`LIMIT100,100SELECT*FROM`user_operation_log`LIMIT1000,100SELECT*FROM`user_operation_log`LIMIT10000,100SELECT*FROM`user_operation_log`LIMIT100000,100SELECT*FROM`user_operation_log`LIMIT1000000,100
文章图片
从上面结果可以得出结束:偏移量越大 , 花费时间越长
SELECT*FROM`user_operation_log`LIMIT100,100SELECTid,attrFROM`user_operation_log`LIMIT100,100如何优化
既然我们经过上面一番的折腾 , 也得出了结论 , 针对上面两个问题:偏移大、数据量大 , 我们分别着手优化
优化偏移量大问题
采用子查询方式
我们可以先定位偏移位置的id , 然后再查询数据
SELECT*FROM`user_operation_log`LIMIT1000000,10SELECTidFROM`user_operation_log`LIMIT1000000,1SELECT*FROM`user_operation_log`WHEREid>=(SELECTidFROM`user_operation_log`LIMIT1000000,1)LIMIT10查询结果如下:
文章图片
从上面结果得出结论:
第一条花费的时间最大 , 第三条比第一条稍微好点子查询使用索引速度更快缺点:只适用于id递增的情况
id非递增的情况可以使用以下写法 , 但这种缺点是分页查询只能放在子查询里面
注意:某些mysql版本不支持在in子句中使用limit , 所以采用了多个嵌套select
SELECT*FROM`user_operation_log`WHEREidIN(SELECTt.idFROM(SELECTidFROM`user_operation_log`LIMIT1000000,10)ASt)采用id限定方式
这种方法要求更高些 , id必须是连续递增 , 而且还得计算id的范围 , 然后使用between , sql如下
SELECT*FROM`user_operation_log`WHEREidbetween1000000AND1000100LIMIT100SELECT*FROM`user_operation_log`WHEREid>=1000000LIMIT100查询结果如下:
文章图片
从结果可以看出这种方式非常快
注意:这里的LIMIT是限制了条数 , 没有采用偏移量
优化数据量大问题
返回结果的数据量也会直接影响速度
SELECT*FROM`user_operation_log`LIMIT1,1000000SELECTidFROM`user_operation_log`LIMIT1,1000000SELECTid,user_id,ip,op_data,attr1,attr2,attr3,attr4,attr5,attr6,attr7,attr8,attr9,attr10,attr11,attr12FROM`user_operation_log`LIMIT1,1000000查询结果如下:
- 游戏老斯鸡|李白首次加入,史诗优化二选一,小乔有全皮肤的巨赚!,8号皮肤碎片升值了
- 羽墨说游戏|开创了一代经典玩法,却因BUG走向没落,曾火遍网吧的射击网游
- 火线游戏|打野直接首发,IG二队获LDL冠军!网友:上单来一队打替补
- 游戏资讯小驿站|我的世界拔刀剑模组:独特设定!帮助玩家更深入了解刀的制作
- 游戏领航员|10月16发售,《帝国时代3决定版》上线Steam
- 游戏丹|高渐离和貂蝉我忍了,这两位真的忍不了!,开大就想一打五的英雄
- 游戏小青锋|王者荣耀:一级最有可能拿五杀的英雄是谁?这位法师当之无愧!
- 篝火营地|玩家《梦想世界》中打造《降世神通》游戏,用游戏制作“游戏”
- 大拿爱游戏|IG.Y,拿起那个属于你们的冠军,S11等你,捧杯吧
- Games游戏|复刻地图非常不错,玩家可以免费解馋,大神制作堡垒之夜版糖豆人