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列建立索引


解析查询语句发现:建立索引以后,两者在影响的行数、消耗的时间等方面的差距很小。



添加一个没有索引的字段约束,分区的优势又明显的体现出来;经过查询解析发现,导致这一结果的原因同上:分区缩小了查询范围。