mysql如何处理500万数据呢?高手请进!

mysql如何处理500万数据呢?高手请进!,第1张

我不是高手.

你用什么方法查询.

如果用like的话.基本上各种办法都很难从根本解决.

分区,分表可以尝试.不过并没解决like的问题.

因为语句不复杂.所以.从语句上优化比较难.

还是想办法从数据结构入手吧.

搜索的内容是否有一定规律.如果有可以建立查询缓存.

在老版本的MySQL 3.22中,MySQL的单表限大小为4GB,当时的MySQL的存储引擎还是ISAM存储引擎。但是,当出现MyISAM存储引擎之后,也就是从MySQL 3.23开始,MySQL单表最大限制就已经扩大到了64PB了(官方文档显示)。也就是说,从目前的技术环境来看,MySQL数据库的MyISAM存储 引擎单表大小限制已经不是有MySQL数据库本身来决定,而是由所在主机的OS上面的文件系统来决定了。

而MySQL另外一个最流行的存储引擎之一Innodb存储数据的策略是分为两种的,一种是共享表空间存储方式,还有一种是独享表空间存储方式。

当使用共享表空间存储方式的时候,Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所 以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单 表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。

而当使用独享表空间来存放Innodb的表的时候,每个表的数据以一个单独的文件来存放,这个时候的单表限制,又变成文件系统的大小限制了。

我们知道可以将一个海量记录的

MySQL

大表根据主键、时间字段,条件字段等分成若干个表甚至保存在若干服务器中。

唯一的问题就是跨服务器批量查询麻烦,只能通过应用程序来解决。谈谈在Java中的解决思路。其他语言原理类似。

这里说的分表不是

MySQL

5.1

partition,而是人为把一个表分开存在若干表或不同的服务器。

1.

应用程序级别实现

见示意图

electThreadManager

分表数据查询管理器

它为分表的每个database

or

server

建立一个

thread

pool

addTask()

-

添加任务

stopTask()

-

停止任务

getResult()

-

获取执行结果

最快的执行时间

=

最慢的

MySQL

节点查询消耗时间

最慢的执行时间

=

超时时间

某个

ThreadPool

忙时候处理流程

1.

假如

ThreadPoolN

非常忙,(也意味

DB

N

非常忙);

2.

新的查询任务到来,addTask(),

新的任务的一个thread加到ThreadPoolN任务排队中

3.

外层应用已经获得其他

thread

返回结果,继续等待

4.

外层应用等待超时的时间到,调用

stopTask()

设置该任务全部

thread

中的停止标志,

外层应用返回。

5.

若干时间后,ThreadPoolN取到该排队

Thread,

因为设置了停止位,线程直接运行完成。

2.

JDBC

层实现

做一个

JDBC

Driver

的包装,拦截

PreparedStatement,

Statement

executeQuery()

然后调用

SelectThreadManager

完成

3.

MySQL

partition

MySQL

5.1

partition

功能由于单张表的数据跨文件,批量查询时候同样存在上述问题,不过它是在

MySQL

内部实现的,不需要外部调用者关心。其查询实现的原理应该大致类似。

partition

只解决了

IO

的瓶颈,并不能解决

CPU

计算的瓶颈,因此无法代替传统的手工分表方式。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7369527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存