`
步青龙
  • 浏览: 297381 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
72ba33fb-eefe-3de1-bd65-82a6e579265d
Java面试
浏览量:0
社区版块
存档分类
最新评论

mysql 超1亿数据,优化分页查询

 
阅读更多

my.ini参数

table_cache=512
bulk_insert_buffer_size = 100M
innodb_additional_mem_pool_size=30M
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=207M
innodb_log_file_size=128M

 innodb_flush_log_at_trx_commit默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。对于事务要求很强,设置为0 是存在安全问题的

mysql创建表

CREATE TABLE `news` (
  `id` int(19) NOT NULL AUTO_INCREMENT,
  `title` varchar(30) DEFAULT NULL,
  `content` varchar(400) DEFAULT NULL,
  `type` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `PK_NEWS_ID` (`id`),
  KEY `INDEX_NEWS_ID_TYPE` (`id`,`type`),
  KEY `INDEX_NEWS_TYPE` (`type`)
) ENGINE=InnoDB AUTO_INCREMENT=1072779 DEFAULT CHARSET=utf8

java插入测试数据代码放到文章最后面

mysql5.5 支持 insert into mytable value (xxx,xxx....),(xxx,xxx....)...........插入多条记录,相比addBatch 好不到哪里,而且mysql数据包有限制,超大字符串对JVM也很难消受

查询随着select字段增多会消耗更多时间,limit a,b 也会随着a的增大而加大查询时间。

现在数据已经添加到了至少6200万条数据,



 

 

  in的速度是惊人的 

 

 可见复合索引带来性能的优势

这个表大约是6200万条记录,综合一下2个最重要的速度最快查询 就是分页的查询语句


 

大表查询总结: 1 复合索引好好使用 2   in 要好好使用

上面的都是传统分页的,分页做下改进

1   当页面传到controller层有一个page对象,代表要查询的页数,那么我们的sql可以随着变化

start=(page-1)*pagesize+1  然后是where做限制 就是where加上 id >= start

如果表中增加了一个type='ios8' 因为ios8 的数据是从三千多万多条开始的,假设是32888888条记录,后面才增加type='ios8'的记录,那么分页就可以加上   id >= start + 32888888

2   对于新闻类,老的数据分页是固定的,所以可以分表,新闻就要新闻

所以最新的新闻的分页好办,表里面弄几百页就够了,其他的数据放到一个老数据表里面,老数据表的存储引擎改成MyISAM

比如前500页就查询news的数据,后面的就查询oldnews1,oldnews2.....表的数据,对old表做一下策略每个old表的一种分类只允许有100000页的数据。

假设oldnew1表,是数据里面最先入进去的,是知道id的范围的,但是oldnews1表分页的页数是会变的

我们在老数据表每个表里面都增加一个page字段,存储页数,由于页数是会变动的,所以我们需要页码字段和数据倒着来,那么插入的时候就不会改动前面的页码的,我们知道有多少个老表。假设有10个老表

limit a,b,那么a就会大于 (news表的总页数*pagesize-news表的总条数+ 9*100000*pagesize),查询页码的时候就需要-100000+1,因为页码字段是倒着来的. 

3  上面分表+页码策略做的话性能会明显的提升很多,但是表中有大字段而且字段超多始终会对性能产生影响,老新闻是不变的,可以做静态化处理,我们新增一个路径表urloldnew1,.....,只给一个id,page,url即可,查询的时候就用这样就可以让表的数据字段大大减少,不去查询老的原始数据表。

url是生成的静态文件地址,这需要静态化的时候进行二次加密,根据文件路径生成 加密码,然后根据加密码生成静态路径。

4   下面对单条新闻设计。

查询单条新闻:

看到的类似于 www.myblog.com/s/blog_s897yu_99uiiu_s7yht.html  

这是经过加密的,后台要解密前台传递过来的字符串

如jkser896 _  89hhgii  _  oiy67hjk 

根据字段表再次解密 java开发者     _        /news/old8/      1243546678

这样拼接路径就成了。

最后把java插入测试数据放到附件里

 

---- 数据已经增加到了一个亿多,分页查询性能丝毫不减,Mysql竟然如此精悍



 

 

 听大婶们说in不走索引的啊,看看大婶们对吗?in里面放一万个



 

 

 

 

  • 大小: 41.5 KB
  • 大小: 34.4 KB
  • 大小: 30.6 KB
  • 大小: 27.2 KB
  • 大小: 16.6 KB
  • 大小: 27.5 KB
  • 大小: 32.5 KB
  • 大小: 18.4 KB
  • 大小: 39 KB
  • 大小: 31.3 KB
4
1
分享到:
评论
3 楼 chpn 2015-12-24  
addBatch确实可以

1.这个和复合索引没得毛关系
2.in查询快,那是因为是在聚合索引上查找
2 楼 步青龙 2015-12-22  
dagf113225 写道
请问,这个mysql执行SQL的花费的时间的工具叫什么?谢谢!

我用的是navcat9.0.15
1 楼 dagf113225 2015-12-21  
请问,这个mysql执行SQL的花费的时间的工具叫什么?谢谢!

相关推荐

    MySQL 亿级数据分页的优化

    MySQL在处理亿级数据分页时,可能会遇到性能瓶颈,特别是在使用大偏移量的`LIMIT`语句时。在上述场景中,由于一个名为ApiAutotest的客户端程序通过多线程调用接口,使用了异常大的分页参数(如`offset=1800000`和`...

    大数据量多线程执行分页查询

    1. **大数据量处理**:当数据库中的数据达到百万甚至亿级时,单线程查询可能导致响应时间过长,用户体验下降。因此,采用有效的方法对大量数据进行处理至关重要。 2. **多线程**:多线程是并发编程的一种方式,允许...

    Mysql千万级别数据优化方案

    在 MySql 单表中数据达到千万级别时,数据的分页查询结果时间过长,对此进行优达到最优效果,也就是时间最短。为了解决这个问题,我们需要了解 MySQL 数据库的分页原理和索引的建立。 二、 解决思路与根据 1. 建立...

    112 案例实战:亿级数据量商品系统的SQL调优实战(1).pdf

    1. 亿级数据量下SQL性能调优的重要性:在处理包含亿级数据量的电商平台商品系统时,SQL性能调优变得至关重要。大量的数据导致数据库的压力剧增,因此任何微小的性能问题都可能被放大,导致系统性能急剧下降,甚至...

    海量数据的实时读写和查询实践.pptx

    - 需求包括实时读写、复杂的SQL分页查询以及每月商家的数百万明细数据导出。 2. **系统挑战**: - 存储亿级增量结算数据,同时保证数据的实时性、一致性和完整性。 - 应对数百个应用实例对数据库的压力,确保...

    bbs论坛 java mysql

    分页可以结合数据库查询的LIMIT和OFFSET关键字实现。 11. **安全性**:防止SQL注入和跨站脚本攻击(XSS)是开发Web应用时必须考虑的安全措施。使用预编译语句或ORM框架可以帮助防御SQL注入,而对用户输入进行转义或...

    115 案例实战:数十亿数量级评论系统的SQL调优实战(1).pdf

    3. 分页优化:避免使用大的`OFFSET`值。可以采用“bookmark”或“keyset”分页方法,通过存储上一页最后一个评论的`id`,在下一次查询时作为起点,这样可以减少`OFFSET`的计算和扫描范围。 4. 数据归档:对于历史...

    MyCAT的S级别任务

    当面临1亿级别的数据排序、分组和分页问题时,MyCAT需要高效策略。一种方法是限制内存中排序字段的大小,超出部分存储在DirectBuffer映射的文件中。由于数据已经按分片排序,部分排序算法可提高效率,例如,通过...

    留言管理系统

    5. **查询优化**:如`分页查询.sql`所示,系统可能采用分页技术来提高查询效率,减少一次性加载大量数据带来的负担。 6. **数据库设计**:如`创建t_person.sql`和`创建t_note.sql`所示,合理的数据库设计可以提高...

    2021-2022计算机二级等级考试试题及答案No.14761.docx

    8. MySQL中的`LIMIT`用于限制查询结果的数量,常用于分页查询。 9. 在数据库中,确保学生数据表不出现同名学生,需要建立唯一性约束或主键,这对应于记录的有效性规则,选择D。 10. RAM(Random Access Memory)是...

    搜狐&&美团旅行面试题.docx

    - Elasticsearch的`from/size`分页通过跳过前`from`条记录,然后返回`size`条记录的方式实现分页查询。这种方式可能导致性能下降,特别是在分页很深的情况下。 9. **手写一个LRU缓存** - LRU缓存可以通过哈希表...

    Python-scrapydjango增量抓取天涯莲蓬鬼话全部帖子

    9. **数据存储**: Django的模型层可以方便地将抓取的数据存储到关系型数据库(如MySQL、PostgreSQL)中,也可以使用其他存储方式如MongoDB、SQLite等。此外,还可以利用Django的admin后台,方便地查看和管理抓取的...

Global site tag (gtag.js) - Google Analytics