大家好,关于Mysql数据库有容量限制么很多朋友都还不太明白,今天小编就来为大家分享关于为什么mysql不建议3表以上的知识,希望对各位有所帮助!
本文目录
mysql数据库表的大小有限制吗
没有限制,但由于安装的系统的分区格式,系统原因等造成对数据大小的限制,比如FAT32格式下就无法保存大于4GB的数据。
mysql有全局临时表吗
先来说说临时表的概念。临时表顾名思义,就是临时的,用完销毁掉的表。数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。临时表有下面几种:
1全局临时表
这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效。在MySQL里面这种临时表对应的是内存表,即memory引擎。
2会话级别临时表
这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以createtemporarytable这样的关键词创建的表。
3事务级别临时表
这种临时表在事务开始时生效,事务提交或者回滚后失效。在MySQL里面没有这种临时表,必须利用会话级别的临时表间接实现。
4检索级别临时表
这种临时表在SQL语句执行之间产生,执行完毕后失效。在MySQL里面这种临时表不是很固定,跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样,只是数据保存在内存里;如果默认引擎是INNODB,那么临时表的引擎就是INNODB,此时它的所有信息都保存在共享表空间ibdata里面。
MySQL5.7对于InnoDB存储引擎的临时表空间做了优化。在MySQL5.7之前,INNODB引擎的临时表都保存在ibdata里面,而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL5.7中,对于临时表做了下面两个重要方面的优化:
MySQL5.7把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来,形成自己单独的表空间,参数为innodb_temp_data_file_path。
在MySQL5.7中把临时表的相关检索信息保存在系统信息表中:information_schema.innodb_temp_table_info.而MySQL5.7之前的版本想要查看临时表的系统信息是没有太好的办法。
需要注意的一点就是,虽然INNODB临时表有自己的表空间,但是目前还不能自己定义临时表空间文件的保存路径,只能是继承innodb_data_home_dir。此时如果想要拿其他的磁盘,比如内存盘来充当临时表空间的保存地址,只能用老办法,做软链。举个小例子:
我现在用的OS是Ubuntu12.X,想用tmpfs文件系统充当临时表空间,
root@ytt-master-VirtualBox:/usr/local/mysql/data#ln-s/run/shm//usr/local/mysql/data/tmp_space2
root@ytt-master-VirtualBox:/usr/local/mysql/data#ls-l|grep'shm'
lrwxrwxrwx1rootroot9Nov1310:28tmp_space2->/run/shm/
然后把
innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend
添加到my.cnf里的[mysqld]下面一行
重启MySQL服务后,
mysql>select@@innodb_temp_data_file_path\G
***************************1.row***************************
@@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend
1rowinset(0.00sec)
先写一个批量创建临时表的存储过程:
DELIMITER$$
USE`t_girl`$$
DROPPROCEDUREIFEXISTS`sp_create_temporary_table`$$
CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_create_temporary_table`(
INf_cntINTUNSIGNED)
BEGIN
DECLAREiINTUNSIGNEDDEFAULT1;
WHILEi<=f_cnt
DO
SET@stmt=CONCAT('createtemporarytabletmp',i,'(idint,tmp_descvarchar(60));');
PREPAREs1FROM@stmt;
EXECUTEs1;
SETi=i+1;
ENDWHILE;
DROPPREPAREs1;
END$$
DELIMITER;
现在来创建10张临时表:
mysql>callsp_create_temporary_table(10);
QueryOK,0rowsaffected(0.07sec)
如果在以前,我们只知道创建了10张临时表,但是只能凭记忆或者手工记录下来临时表的名字等信息。
现在可以直接从数据字典里面检索相关数据。
mysql>select*frominformation_schema.innodb_temp_table_info;
+----------+--------------+--------+-------+----------------------+---------------+
|TABLE_ID|NAME|N_COLS|SPACE|PER_TABLE_TABLESPACE|IS_COMPRESSED|
+----------+--------------+--------+-------+----------------------+---------------+
|56|#sql1705_2_9|5|36|FALSE|FALSE|
|55|#sql1705_2_8|5|36|FALSE|FALSE|
|54|#sql1705_2_7|5|36|FALSE|FALSE|
|53|#sql1705_2_6|5|36|FALSE|FALSE|
|52|#sql1705_2_5|5|36|FALSE|FALSE|
|51|#sql1705_2_4|5|36|FALSE|FALSE|
|50|#sql1705_2_3|5|36|FALSE|FALSE|
|49|#sql1705_2_2|5|36|FALSE|FALSE|
|48|#sql1705_2_1|5|36|FALSE|FALSE|
|47|#sql1705_2_0|5|36|FALSE|FALSE|
+----------+--------------+--------+-------+----------------------+---------------+
10rowsinset(0.00sec)
功能性我就写到这里,大家性能方面如果有兴趣可以找时间去测试。
为什么mysql不适合大数据检索
因为mysql的数据存储机制就是小数据输入表的结构,无论查询还是添加都比较耗时,在大数据上是不可行的。
Mysql数据库有容量限制么
MySQL3.23开始,MySQL单表最大限制就已经扩大到了64PB了(官方文档显示)。
也就是说,从目前的技术环境来看,MySQL数据库的MyISAM存储引擎单表大小限制已经不是有MySQL数据库本身来决定,而是由所在主机的OS上面的文件系统来决定了。还有磁盘系统比如mbr磁盘系统单区最大2Tb再说。还有速度限制,如果查询速度已经不能满足要求了就要分表来存储关于Mysql数据库有容量限制么的内容到此结束,希望对大家有所帮助。