垂直分表

垂直分表就是一个包含有很多列的表拆分成多个表,比如表A包含20个字段,现在拆分成表A1和A2,两个表各十个字段(具体如何拆根据业务来选择)。

优势:在高并发的情境下,可以减少表锁和行锁的次数。

劣势:在数据记录非常大的情况下,读写速度还是会遇到瓶颈。

水平分表

假如某个网站,它的数据库的某个表已经达到了上亿条记录,那么此时如果通过select去查询,在没有索引的情况下,他的查询会非常慢,那么就可以通过hash算法将这个表分成10个子表(此时每个表的 的数据量只有1000万条了)。

同时生成一个总表,记录各个子表的信息,假如查询一条id=100的记录,它不再需要全表扫描,而是通过总表找到该记录在哪个对应的子表上,然后再去相应的表做检索,这样就降低了IO压力。

劣势:会给前端程序应用程序的SQL代码的维护带来很大的麻烦,这时候可以使用MySQL的Merge存储引擎实现分表。

---------------------------------------我是蛋疼的分割线----------------------------------------------------

用Merge存储引擎分表,对应用程序的SQL语句来说是透明的,不需要修改任何代码。

CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist

如果需要定期增加分表,只需要修改merge表的union即可。

CREATE TABLE t3( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));ALTER TABLE total UNION=(t1,t2,t3)

举例说明:假如有100W条数据,分成十份,前10W条数据放到第一个分区,第二个10W条数据放到第二个分区,依此类推。取出一条数据的时候,这条数据包含了表结构中的所有字段,横向分区并没有改变表的结构。

纵向分区

举例说明:在设计用户表的时候,开始的时候没有考虑好,而把个人的所有信息都放到了一张表里面去,这个表里面就会有比较大的字段,如个人简介,而这些简介呢,也许不会有好多人去看,所以等到有人要看的时候,再去查找,分表的时候,可以把这样的大字段,分开来

完整的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

更多相关文章

  1. Python list sort方法的具体使用
  2. Android(安卓)的 Recovery 分析
  3. (2) 搭建 Android(安卓)系统开发环境
  4. Android调用平台功能具体技巧分享
  5. 在Mac下编译 android 源代码
  6. Android调用平台功能具体技巧分享
  7. 高通方案的Android设备几种开机模式的进入与退出
  8. Android原生程序与Flutter交互具体实现
  9. Android安装卸载程序具体操作方法解析

随机推荐

  1. python爬网页,做k线图
  2. python类的成员和装饰器
  3. 用python完成1-100的加法
  4. python多线程文件传输范例(C/S)
  5. [Python]PDF合成小程序PDF合成小程序
  6. 关于python return 和 print 的区别
  7. python基础练习--列表问题
  8. python list range 字符串的截取 如 text
  9. 如何将两个列表中的数据写入csv中的列?
  10. Python list 交集,并集,差集