mysql分表与分区
来源:互联网 发布:耽美漫画软件 编辑:程序博客网 时间:2024/06/11 18:55
1、首先得确认mysql是否支持分区功能,这可以通过命令:show plugins查看
如果显示如下,则说明你的mysql版本支持partition
2、InnoDB一般用于具有事务和外键的场合,它默认将所有的表数据和索引文件放在一个名为ibdata1的文件中,属于共享表空间。
MyISAM默认每个表都会有一个.frm表描述文件和一个.ibd文件,属于独占表空间。
分区必须是独占表空间,所以要想把InnoDB引擎表分区,须先将InnoDB设置为独占表空间,这需要修改配置文件,在/etc/mysql/my.cnf中添加一行innodb_file_per_table=1;并去掉相应行的注释符,重启服务。
通过show engines命令可知,mysql默认的存储引擎为InnoDB,修改默认存储引擎方法为:
在/etc/mysql/my.cnf的[mysqld]下面添加:
default-storage-engine = MyISAM
重启mysql服务,即可设置mysql数据库的默认引擎为MyISAM
3、建立一个只含有id字段的t1表,并用hash方式分为5个区(前提是已经存在一个test数据库):
在id上建立一个索引in_id
此时desc t1的结果应该如下:
然后往表t1里面快速插入一千万行数据:
先执行:insert into t1 values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
然后多次执行:insert into t1 select * from t1即可
当然,也可以写一个存储过程来达到此目的
在这插入的过程中,我们可以重新开启一个终端来观察插入时的动态:
先切换到test数据库存储位置:cd /var/lib/mysql/test
然后执行:watch -n1 -ls -lh,你会看到一个动态的列表。
插入完毕时,我们可以看到表中的数据不再变化,索引表的大小明显大于数据表的大小,这就告诉我们索引是在牺牲存储空间的前提下提高处理速度的,所以索引不是建得越多越合理;(注:t1.frm指表的文件结构,t1.par指表已经做了分区存储,而每个分区包括.MYD和.MYI两个表,.MYD表用来存储数据,.MYI表用来存储索引,这种存储策略能保证存储速度更快。)
以上内容是对兄弟连李强强老师录制的视频的语言复述
大家要注意,视频第14讲中,range分区实验插入800万条记录的中间过程有剪切,大家不要半途终止命令的执行(约13分钟),下图是我实验的结果:
对已分区表查询:
对未分区表查询:
结论:由上图可知,查询条件相同时,分区情况下只影响了798458行,未分区情况下影响了8000000行(整个表),这是因为,分区以后,会直接从满足条件的分区内进行查询,而对于不满足条件的分区予以忽略。所以,对于大数据量的情况下,分区能明显加快查询速度!
继续往下走:给两个表的c3列建立索引
解析查询语句发现:建立索引以后,两者在影响的行数、消耗的时间等方面的差距很小。
添加一个没有索引的字段约束,分区的优势又明显的体现出来;经过查询解析发现,导致这一结果的原因同上:分区缩小了查询范围。
- mysql分表与分区
- mysql分表与分区
- mysql 分区与分表
- MySQL分表与分区
- mysql 分区 与分表
- mysql 分表与分区
- Mysql第八天 分区与分表
- MySQL分表与分区的区别
- Mysql的分区与分表
- mysql分表与分区的区别
- mysql的分区与分表
- 详解mysql分区与分表
- mysql分表,分区
- mysql分区分表
- mysql分表,分区
- MySQL分表、分区
- mysql分表分区
- Mysql分表分区
- DBNull.Value,null,String.Empty之间的区别和联系
- 又学了一个东西
- 让VS.Net根据表结构自动生成界面和C#代码
- JNA 详细完整实例
- 【Oracle】Oracle字符串长度
- mysql分表与分区
- 杂感
- MySQL 命令行下执行.sql脚本
- C#将图片转成pdf
- 服务器出现HTTP400、401、402、403错误原因及解决方法
- 向 MFC 项目添加 D2D 对象
- linux中tomcat内存溢出解决办法
- .NET 分部方法
- win8 APP