mysql分表

MySQL分表自增ID解决方案

心不动则不痛 提交于 2021-02-08 12:42:42
当我们对MySQL进行分表操作后,将不能依赖MySQL的自动增量来产生唯一ID了,因为数据已经分散到多个表中。 应尽量避免使用自增IP来做为主键,为数据库分表操作带来极大的不便。 在postgreSQL、oracle、db2数据库中有一个特殊的特性---sequence。 任何时候数据库可以根据当前表中的记录数大小和步长来获取到该表下一条记录数。然而,MySQL是没有这种序列对象的。 可以通过下面的方法来实现sequence特性产生唯一ID: 1. 通过MySQL表生成ID 在《 关于MySQL分表操作的研究 》提到了一种方法: 对于插入也就是insert操作,首先就是获取唯一的id了,就需要一个表来专门创建id,插入一条记录,并获取最后插入的ID。代码如下: CREATE TABLE `ttlsa_com`.`create_id` ( `id` BIGINT( 20 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE = MYISAM 也就是说,当我们需要插入数据的时候,必须由这个表来产生id值,我的php代码的方法如下: <?php function get_AI_ID() { $sql = "insert into create_id (id) values('')"; $this->db->query($sql); return

MySQL分库分表方案

醉酒当歌 提交于 2020-04-07 07:15:48
1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。 mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。 2. mysql proxy:amoeba 做mysql集群,利用amoeba。 从上层的java程序来讲,不需要知道主服务器和从服务器的来源,即主从数据库服务器对于上层来讲是透明的。可以通过amoeba来配置。 3.大数据量并且访问频繁的表,将其分为若干个表 比如对于某网站平台的数据库表-公司表,数据量很大,这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。 某网站现在的数据量至多是5000万条,可以设计每张表容纳的数据量是500万条,也就是拆分成10张表, 那么如何判断某张表的数据是否容量已满呢?可以在程序段对于要新增数据的表,在插入前先做统计表记录数量的操作,当<500万条数据,就直接插入,当已经到达阀值,可以在程序段新创建数据库表(或者已经事先创建好),再执行插入操作。 4. 利用merge存储引擎来实现分表 如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码

Mysql 分区 分表相关总结之方案选择

江枫思渺然 提交于 2020-01-10 10:55:00
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> [TOC] ##引述 前段时间项目需要,一直在研究mysql sharding,看了一些这方面的资料,也亲自实验测试了一些数据。在此,做个概括的笔记,方便以后回顾知识,其实大多是借鉴网络上各位前辈的,然后抱着学习态度去实践,积累属于自己的东西。 ##拆分策略选择 其实拆分很灵活,有的是 垂直切分 ,将一个库拆成两个或多个,将有相关联的表放在一个库里。有的是 水平切分 将数据量大的表按照一定逻辑进行拆分。个人感觉垂直切分的相对来说缓解了IO的瓶颈,而水平切分,目的是减轻了单个表或某些表读写的压力。 我们项目根据个人需求,采用的水平切分,没有去分库。之后要看看需要采用何种的切分了。 了解到的有: 分表、分区、MERGE引擎分表。 ###MERGE引擎分表 ####简介 先介绍merge表,此方法 只 适用于MyISAM。我数据库的表都是采用InnoDB引擎的,所以首先就被pass了,但是还是在这里简单介绍下吧。 mysql 5.1 手册里的说的 An alternative to a MERGE table is a partitioned table, which stores partitions of a single table in separate files. Partitioning enables

mysql分库分表的一些技巧

放肆的年华 提交于 2019-12-03 02:46:22
分表是分散数据库压力的好方法。 分表 ,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库。 当然,首先要知道什么情况下,才需要分表。个人觉得单表记录条数达到百万到千万级别时就要使用分表了。 1,分表的分类 1>纵向分表 将本来可以在同一个表的内容,人为划分为多个表。(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的。) 分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的) 案例: 对于一个博客系统,文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据。所以,在进行数据库结构设计的时候,就应该考虑分表,首先是纵向分表的处理。 这样纵向分表后: 首先存储引擎的使用不同,冷数据使用MyIsam 可以有更好的查询数据。活跃数据,可以使用Innodb ,可以有更好的更新速度。 其次,对冷数据进行更多的从库配置,因为更多的操作时查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。 其实,对于一些特殊的活跃数据,也可以考虑使用memcache ,redis之类的缓存,等累计到一定量再去更新数据库。或者mongodb 一类的nosql 数据库