当表的数据量达到一定数量时(如单个.myd文件都达到10G,myd 是mysql的数据文件),这时候读取起来必然效率很低。
1、从业务角度可以解决(分表)
比如,通过 id %10,user0、user1.... 根据不同的余数插入不同的表。但是较麻烦
保证不了数据的唯一性。
2、通过 mysql 的分区功能
①create table topic( //范围内分区
tid int primary key auto_increment,
title char(20) not null default ''
)engine myisam charset utf8
partition by range(tid)( //根据那个字段分区
partition t0 values less than(10), //小于10的在第一个区
partition t1 values less than(20), //小于20的在第二个区
partition t2 values less than(MAXVALUE) //大于20的在第三个区
);
好处是:打开的线程数更多、读取效率更高(不会因为读取同一个 MYD 文件而锁住)
alter table topic drop partition t2 #删除分区。
alter table topic add partition( #增加分区【增加前要先删除之前指定的最大值】
partition t0 values less than(30), #小于30的在第一个区
partition t1 values less than(40), #小于40的在第二个区
partition t2 values less than(MAXVALUE) #大于40的在第三个区
)
②create table user( #根据散列值分区
uid int,
uname char(6),
aid int
)engine myisam charset utf8
partition by list(aid)(
partition bj values in (1), #如果 aid=1 插入到 bj 分区文件
partition hb values in (2), #如果 aid=2 插入到 hb 分区文件
partition xs values in (3), #如果 aid=3 插入到 xs 分区文件
partition ah values in (4) #如果 aid=4 插入到 ah 分区文件
);
注意:使用分区的使用,分区的那一列值不要为null(如果不小心为null,mysql 理解为0 尽量去执行)。
也可以用表达式返回值,但是不如值来的快。比如:partition by rang(year(regtime)) 用注册年分来区分。
innodb 在高并发下分区的增删改优于 myisam
mysql 有自带的并发检测程序:mysqllasp
还有 hash、hashkey、list 分区
不能给之前没有分区的表修改添加分区。
不能给之前没有分区的表修改添加分区。
cd /var/lib/mysql/
ls //显示当前所有的数据库
cd itool/ //进入到某个数据库
ls //显示当前库的所有文件
.frm //表的结构文件
.MYD //表的数据文件
.MYI //表的索引文件