mysql千万级数据分组查询_mysql千万级数据查询

1. mysql 的数据查询 , 大小字段要分开 , 这个还是有必要的 , 除非一点就是你查询的都是索引内容而不是表内容 , 比如只查询 id 等等 2. 查询速度和索引有很大关系也就是索引的大小直接影响你的查询效果 , 但是查询条件一定要建立索引 , 这点上注意的是索引字

1.mysql的数据查询,大小字段要分开,这个还是有必要的,除非一点就是你查询的都是索引内容而不是表内容,比如只查询id等等2.查询速度和索引有很大关系也就是索引的大小直接影响你的查询效果,但是查询条件一定要建立索引,这点上注意的是索引字段不能太多,太多索引文件就会很大那样搜索只能变慢,

3.查询指定的记录最好通过Id进行in查询来获得真实的数据.其实不是最好而是必须,也就是你应该先查询出复合的ID列表,通过in查询来获得数据

我们做个测试

Sql代码

test.jsp?url=http%3A%2F%2Fyanzhenwei.iteye.com%2Fimages%2Ficon_star.png&refer=http%3A%2F%2Fblog.csdn.net%2Fyangyu19910407%2Farticle%2Fdetails%2F9856967

CREATETABLE`ipdatas` (

`id` INT(11)NOTNULLAUTO_INCREMENT,

`uid` INT(8)NOTNULLDEFAULT'0',

`ipaddress` VARCHAR(50)NOTNULL,

`source` VARCHAR(255)DEFAULTNULL,

`track` VARCHAR(255)DEFAULTNULL,

`entrance` VARCHAR(255)DEFAULTNULL,

`createdtime` DATETIME NOTNULLDEFAULT'0000-00-00 00:00:00',

`createddate` DATENOTNULLDEFAULT'0000-00-00',

PRIMARYKEY(`id`),

KEY`uid` (`uid`)

) ENGINE=MYISAM AUTO_INCREMENT=67086110 DEFAULTCHARSET=utf8;

里面有七百万数据。

1.全表搜索返回结构是67015297条数据SELECT COUNT(id) FROM ipdatas;

SELECT COUNT(uid) FROM ipdatas;

SELECT COUNT(*) FROM ipdatas;首先这两个全表数据查询速度很快,mysql中包含数据字典应该保留了数据库中的最大条数SELECT COUNT(*) FROM ipdatas WHERE uid=1;返回结果时间:2分31秒594

SELECT COUNT(id) FROM ipdatas WHERE uid=1;返回结果时间:1分29秒609

SELECT COUNT(uid) FROM ipdatas WHERE uid=1;返回结果时间:2分41秒813第二次查询都比较快因为mysql中是有缓存区的所以增大缓存区的大小可以解决很多查询的优化,真可谓缓存无处不在啊在程序开发中也是层层都是缓存第一条开始查询SELECT * FROM ipdatas ORDER BY id DESC LIMIT 1,10 ; 31毫秒SELECT * FROM ipdatas LIMIT 1,10 ; 15ms第10000条开始查询SELECT * FROM ipdatas ORDER BY id ASC LIMIT 10000,10 ; 266毫秒SELECT * FROM ipdatas LIMIT 10000,10 ; 16毫秒

第500万条开始查询SELECT * FROM ipdatas LIMIT 5000000,10 ;11.312秒SELECT * FROM ipdatas ORDER BY id ASC LIMIT 5000000,10 ; 221.985秒这两条返回结果完全一样,也就是mysql默认机制就是id正序然而时间却大相径庭

第5000万条开始查询SELECT * FROM ipdatas LIMIT 60000000,10 ;66.563秒(对比下面的测试)

SELECT * FROM ipdatas ORDER BY id ASC LIMIT 50000000,10; 1060.000秒SELECT * FROM ipdatas ORDER BY id DESC LIMIT 17015307,10; 434.937秒第三条和第二条结果一样只是排序的方式不同但是用时却相差不少,看来这点还是不如很多的商业数据库,像oracle和sqlserver等都是中间不成两边还是没问题,看来mysql是开始行越向后越慢,这里看来可以不排序的就不要排序了性能差距巨大,相差了20多倍

查询数据返回ID列表select id from ipdatas order by id asc limit 1,10; 31ms

SELECT id FROM ipdatas LIMIT 1,10 ; 0ms第10000条开始SELECT id FROM ipdatas ORDER BY id ASC LIMIT 10000,10; 68ms

select id from ipdatas limit 10000,10;0ms

第500万条开始查询SELECT id FROM ipdatas LIMIT 5000000,10; 1.750s

SELECT id FROM ipdatas ORDER BY id ASC LIMIT 5000000,10;14.328s

第6000万条记录开始查询SELECT id FROM ipdatas LIMIT 60000000,10; 116.406s

SELECT id FROM ipdatas ORDER BY id ASC LIMIT 60000000,10; 136.391s

select id from ipdatas limit 10000002,10; 29.032s

select id from ipdatas limit 20000002,10; 24.594s

select id from ipdatas limit 30000002,10; 24.812s

select id from ipdatas limit 40000002,10; 28.750s 84.719s

select id from ipdatas limit 50000002,10; 30.797s 108.042s

select id from ipdatas limit 60000002,10; 133.012s 122.328s

select * from ipdatas limit 10000002,10; 27.328s

select * from ipdatas limit 20000002,10; 15.188s

select * from ipdatas limit 30000002,10; 45.218s

select * from ipdatas limit 40000002,10; 49.250s 50.531s

select * from ipdatas limit 50000002,10; 73.297s 56.781s

select * from ipdatas limit 60000002,10; 67.891s 75.141s

select id from ipdatas order by id asc limit 10000002,10; 29.438s

select id from ipdatas order by id asc limit 20000002,10; 24.719s

select id from ipdatas order by id asc limit 30000002,10; 25.969s

select id from ipdatas order by id asc limit 40000002,10; 29.860d

select id from ipdatas order by id asc limit 50000002,10; 32.844s

select id from ipdatas order by id asc limit 60000002,10; 34.047s

至于SELECT * ipdatas order by id asc就不测试了大概都在十几分钟左右可见通过SELECT id不带排序的情况下差距不太大,加了排序差距巨大SELECT * FROM ipdatas WHERE id IN (10000,100000,500000,1000000,5000000,10000000,2000000,30000000,40000000,50000000,60000000,67015297);耗时0.094ms可见in在id上面的查询可以忽略不计毕竟是6000多万条记录,所以为什么很多lucene或solr搜索都返回id进行数据库重新获得数据就是因为这个,当然lucene/solr+mysql是一个不错的解决办法这个非常适合前端搜索技术,比如前端的分页搜索通过这个可以得到非常好的性能.还可以支持很好的分组搜索结果集,然后通过id获得数据记录的真实数据来显示效果真的不错

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值