
查询指定的记录最好通过Id进行in查询来获得真实的数据其实不是最好而是必须,也就是你应该先查询出复合的ID列表,通过in查询来获得数据
我们来做一个测试ipdatas表:
CREATE TABLE `ipdatas` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`uid` INT(8) NOT NULL DEFAULT '0',
`ipaddress` VARCHAR(50) NOT NULL,
`source` VARCHAR(255) DEFAULT NULL,
`track` VARCHAR(255) DEFAULT NULL,
`entrance` VARCHAR(255) DEFAULT NULL,
`createdtime` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`createddate` DATE NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY (`id`),
KEY `uid` (`uid`)
) ENGINE=MYISAM AUTO_INCREMENT=67086110 DEFAULT CHARSET=utf8;
这是我们做的广告联盟的推广ip数据记录表,由于我也不是mysql的DBA所以这里咱们仅仅是测试
因为原来里面有大概7015291条数据
这里我们通过jdbc的batch插入6000万条数据到此表当中“JDBC插入6000W条数据用时:9999297ms”;
大概用了两个多小时,这里面我用的是batch大小大概在1w多每次提交,还有一点是每次提交的数据都很小,而且这里用的myisam数据表,因为我需要知道mysql数据库的大小以及索引数据的大小结果是
ipdatasMYD 399 GB (4,288,979,008 字节)
ipdatasMYI 128 GB (1,377,600,512 字节)
这里面我要说的是如果真的是大数据如果时间需要索引还是最好改成数字字段,索引的大小和查询速度都比时间字段可观。
步入正题:
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
MySQL数据库limit分页示例
1selectfrompersonslimitA,B;
解释:
A,查询起点
B,需要的行数
2示例:
selectfrompersonslimit0,4;
解释:
起点位置为0,开始查询,返回4条数据。
selectfrompersonslimit4,4;
解释:
起点为4,开始查询,返回4天数据。
3特殊:
selectfrompersonslimit10;
意思是,起点为0,开始查询,返回10条记录。
与selectfrompersonslimit0,10;是等价的。
4按规则排序的同时,进行分页:
selectfrompersons
orderbylastname
limit0,10;
以上就是关于求教,mysql千万级数据多表查询做分页该如何优化全部的内容,包括:求教,mysql千万级数据多表查询做分页该如何优化、MySQL怎样使用limit获取全部数据(mysql中的limit)、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)