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

本文探讨了MySQL数据库的性能调优方法,包括my.ini配置参数的合理设置,以及针对拥有上亿条记录的大表进行高效查询的技术策略。通过实践案例展示了复合索引与IN操作的有效应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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万条数据,

7a13f01748f1f476ff25fe4883fec628.png

4736a418a8134dffaefc60d06ccf2c86.png

in的速度是惊人的

2010e297f0efec9a24f10fc009fadf4b.png

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

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

0c9ba6459d53b77f041efb8ce38c60c1.png

cff0a4d17f8ad8d2a4ffb9e045708616.png

大表查询总结: 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竟然如此精悍

b42f058e6730f9ab5bd1696e0afdae65.png

5af60b47fd84a446373d4e19cb35681b.png

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

acce50862f9df7857064b4a97da2d76b.png

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值