单实例mysql数据库中到底能建多少张表?

业务两个同学今天就这个问题过来探讨,他们的诉求是:

1. 一个用户的表要全部放到一个数据库中。

2. 预计1000个用户每个用户初步规划1000张表。 这100W张表如何规划如何放的问题。

3. 后期扩容也要考虑。后期扩容要可扩、方便、且用再修改应用程序代码?

面对这样一个场景,技术层面的很好解决,例如数据库到底能存多少张表?查官网资料即可确定。最重要的是要深入了解这么多表如何来的?来源是不是就有问题?有其他解决方案?这个需要深入的了解业务设计。这里不说业务,单说技术层面的。

mysql的配置项里是否有对一个数据库中,是否有最大数据表的限制,后面查询了相关资料发现,mysql数据库中,对单个数据库中的最大允许建立的数据表是没有配置项,也就是说没有限制的。

但是如果你执意要知道MYSQL能够建立多少个表的话,可以参考以下理论值的资料吧:

在mysql中,每个数据库最多可创建20亿个表,一个表允许定义1024列,每行的最大长度为8092字节(不包括文本和图像类型的长度)。

当表中定义有varchar、nvarchar或varbinary类型列时,如果向表中插入的数据行超过8092字节时将导致Transact-SQL语句失败,并产生错误信息。

---- 这个可以用脚本模拟创建表进行测试。创建到20亿之后基本上就创建失败。脚本退出执行。原因待确定中。。。。。。

mysql单数据库对数据表限制数量的问题:

1.一个数据库是没有表现值的,或者说这个被限制的值很大

2.一个mysqld服务可以支持的表对象数量是,单一存储引擎InnoDB限制为40亿多点,所以这个限制基本上不需要考虑

从性能考虑的话,一个数据库建立多少张表适合的问题:

1.当一个数据库或实例中,表太多,意味着可能同时需要打开的表,从操作系统角度说就是:文件描述符很多,这个操作系统有限制的,

但是可以修改操作系统的内核参数达到。Linux最大打开文件数为65535个。

2.多少表性能就会下降,分2点阐述

2.1.分表多,意味着需要维护的表结构和统计信息多,一般情况下此不会成为任何瓶颈,但是太不合理,比如几万甚至更大,可能就有问题了

2.2.性能是否下降明显,最直接的就是:跟服务器的承载能力和数据量有关系,这个是最直接的

3.反问“为何要分很多表”呢?

3.1.分表太多,容易造成程序逻辑复杂,降低性能,以及增加出错的风险点

3.2.若是表中的数据量(指容量,多少GB)很大,只是分表解决不了问题,因为在同一个服务器上,其物理IO能力最优先达到瓶颈
所以,一个数据库建立多少表,这个MYSQL是没有限制的。但是从性能考虑,肯定是有一定影响的,但是从IO和其他服务器性能考虑,这块的性能基本上还不足影响到很大成份。

所以建议大家一个数据库建立在二百个表以下(保守值,最多不要超过500个),这样也是比较合理的了。影响性能也不大。

 第二个问题:

如果必须真有那么多表需要创建,需要做好多库,多数据盘规划:

例如表指定具体的其他盘的存储路径:

        mysql> SHOW VARIABLES LIKE 'innodb_file_per_table';    #先检查一下配置变量
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)如果innodb_file_per_table值为OFF,可以动态修改:set global innodb_file_per_table=1;CREATE TABLE temp3
(empno smallint(4) not null,ename varchar(10),job varchar(9),mgr smallint(4),hiredate date,sal float(7, 2),comm float(7, 2),deptno tinyint(2)
) engine=innodb charset=utf8 data directory='/u01/mysql/temp/';[root@test1 temp]# pwd
/u01/mysql/temp
[root@test1 temp]# ls
temp2.MYD  temp2.MYI  temp.MYD  temp.MYI  test     #由于表在test库下,所以在指定的目录里产生了个test目录

分区表:

CREATE TABLE orders_list2 (id INT AUTO_INCREMENT,customer_surname VARCHAR(30),store_id INT,salesperson_id INT,order_date DATE,note VARCHAR(500),INDEX idx (id)
) ENGINE = INNODBPARTITION BY LIST(store_id) (PARTITION p1VALUES IN (1, 3, 4, 17)INDEX DIRECTORY = '/var/orders/district1'DATA DIRECTORY = '/var/orders/district1',PARTITION p2VALUES IN (2, 12, 14)INDEX DIRECTORY = '/var/orders/district2'DATA DIRECTORY = '/var/orders/district2',PARTITION p3VALUES IN (6, 8, 20)INDEX DIRECTORY = '/var/orders/district3'DATA DIRECTORY = '/var/orders/district3',PARTITION p4VALUES IN (5, 7, 9, 11, 16)INDEX DIRECTORY = '/var/orders/district4'DATA DIRECTORY = '/var/orders/district4',PARTITION p5VALUES IN (10, 13, 15, 18)INDEX DIRECTORY = '/var/orders/district5'DATA DIRECTORY = '/var/orders/district5'
);

2.  table_open_cache, innodb_open_files和open_files_limit 这3个mysql参数配置的尽可能大

不过mysqld启动之后,你看一下这3个变量,它们最终实际值是操作系统分配给mysqld进程的,并不一定能达到你配置的值。

因为 如果表文件(.frm, .ibd等)放到同一个目录,那么打开表都会很慢,因为每次打开一个表都要打开对应的2个表文件,文件系统效率会降低。 (如果这些表不是都用到,建议把不用的表归档然后从实例中删除。)如果这几十万张表都是有用的,那么你要考虑分库分表,以及考虑数据库设计是否合理,每个表是不是只有很少的数据,这些表能否合并,等等。否则,系统查询这三四十万张表的需要反复在table cache中淘汰打开的表才能打开更多的表,性能会降低很多。打开每个表需要打开2个文件,通常linux操作系统不允许一个进程打开的文件达到六十万到八十万个的,在这样的极限状态下操作系统的文件系统的运行效率也会大大降低。所以你需要把table_open_cache, innodb_open_files和open_files_limit 这3个mysql参数配置的尽可能大。

3.  规划Innodb表空间

从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。

原理性的东西;

http://www.linuxidc.com/Linux/2015-01/111241.htm

操作步骤:

http://blog.csdn.net/zm2714/article/details/8479974/

mysql数据库中到底能建多少张表?(单实例下单个库)相关推荐

  1. mysql查找数据库中是否已经存在某张表

    Sql: select count(*) from information_schema.TABLES t where t.TABLE_SCHEMA ="数据库名" and t.T ...

  2. 【项目经验】在填写表单时,首先添加一个失去焦点事件,将数据库中信息自动填充信息到表单,其余信息手动填写然后提交表单。

    如图,在实现添加学籍功能时,程序设计的是当学生表里面有学生信息,而学籍表里没有对应学号的学生的话就添加学籍,所以首先可以选择要添加哪一个学生的学籍信息,一旦选择后就出发一个失去焦点事件然后查询该学生学 ...

  3. 脚本同步mysql数据_windows下数据库文件使用脚本同步到linux下的mysql数据库中

    1.背景 windows server 2008 下 每天会有 *.sql数据文件 需要上传到linux 中的mysql数据库中 而运维人员是在 windows server 下使用 xshell 连 ...

  4. 用 Python selenium爬取股票新闻并存入mysql数据库中带翻页功能demo可下载

    用 Python selenium爬取实时股票新闻并存入mysql数据库中 1.分析需求 2.创建表 3.分析需要爬取的网页内容 4.python里面selenium进行爬虫操作 1.添加包 2.连接 ...

  5. MySql数据库中的权限授予

    MySql数据库中的权限授予 授予权限 需要使用实例级账户登录后操作,以root为例主要操作包括:查看所有用户 修改密码 删除用户 1. 查看所有用户 所有用户及权限信息存储在mysql数据库的use ...

  6. 1亿条数据如何分表100张到Mysql数据库中(PHP)

    来源:http://www.jb51.net/article/70265.htm 这篇文章主要介绍了当数据量猛增的时候如何把一亿条数据分表100张到Mysql数据库中,需要的朋友可以参考下 下面通过创 ...

  7. php 分表 实战,PHP实战:1亿条数据如何分表100张到Mysql数据库中(PHP)

    <PHP实战:1亿条数据如何分表100张到Mysql数据库中(PHP)>要点: 本文介绍了PHP实战:1亿条数据如何分表100张到Mysql数据库中(PHP),希望对您有用.如果有疑问,可 ...

  8. 通过JSP网页连接MySQL数据库,从MySQL数据库中读出一张表并显示在JSP网页中

    1.安装所需软件 ①安装java和tomcat,建立JSP网页最基础的软件 ②安装MySQL数据库(下载地址:https://www.mysql.com/) ③安装Navicat Premium来查看 ...

  9. mysql 5000万条数据库_1亿条数据如何分表100张到Mysql数据库中(PHP)

    下面通过创建100张表来演示下1亿条数据的分表过程,具体请看下文代码. 当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度.笔者做了一个简单的尝试,1亿条数据,分100张表.具体实现过 ...

最新文章

  1. 分享Css3设计---纯Css实现超酷的iphone玻璃气泡效果
  2. 【c语言】蓝桥杯算法提高 7-1用宏求球的体积
  3. 北京 10 年,难说再见!
  4. ISA Server 2006的全自动无人职守安装
  5. 嵌入式Linux入门9:Linux系统使用
  6. Java-虚拟机-启动参数及调优
  7. golang基础-etcd介绍与使用、etcd存取值、etcd监测数据写入
  8. HDMI之DDC通道
  9. PopWindow:基本使用与自定义PopWindow
  10. “AIIA”杯-国家电网-电力专业领域词汇挖掘
  11. R12应付模块详细结账流程
  12. Vite:Error: Cannot find module ‘worker_threads‘
  13. 吉他入门乐理知识精髓篇
  14. Mysql COUNT()条件计数
  15. 适合创业起步看的书推荐
  16. 人工神经网络与深度神经网络
  17. VvalidationError:Invalid options object.Ignore Plugin has been initialized using an options object
  18. OpenPlanner变道遇到的问题及解决
  19. 【LOJ NOI Round#2 Day1 T1】单枪匹马【矩阵】
  20. ssrf+redis未授权靶场

热门文章

  1. 跟着无羡学python第一天
  2. 不用分片也能扩展 10 倍性能?简单了解以太坊 Turbo-Geth 客户端
  3. mysql 中的pri_关于MySQL中 主键 pri mul
  4. 基于matlab的声音识别
  5. 夫妻生活:50岁男人更加有成就感和吸引力
  6. IObit Advanced SystemCare 系统清理优化工具
  7. python中文件操作
  8. 简单快速删除流氓软件(包括注册表)
  9. RuntimeError: CUDA error: no kernel image is available for execution on the driver
  10. 顺丰速运面试java,顺丰三面Java后端面经分享