如何在MySQL中实现分表和分区

26次阅读
没有评论

共计 1687 个字符,预计需要花费 5 分钟才能阅读完成。

自动写代码机器人,免费开通

如何在 MySQL 中实现分表和分区?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

垂直分表

垂直分表就是一个包含有很多列的表拆分成多个表,比如表 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;

在创建 total 表的时候可能报错:

Unable to open underlying table which is differently defined or of non-MyISAM type or doesn t exist

实际上 merge 存储引擎是一个虚拟的表,对应的实际表必须是 myisam 类型的表,如果你的 mysql 是 5.1 以上版本,默认数据库使用的事 InnoDB 存储引擎的,所以在创建 total 时,t1 和 t2 表必须是 myisam 存储引擎的。

如果需要定期增加分表,只需要修改 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 条数据放到第二个分区,依此类推。取出一条数据的时候,这条数据包含了表结构中的所有字段,横向分区并没有改变表的结构。

纵向分区

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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计1687字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)