搜索
您的当前位置:首页正文

MySQL两千万数据优化&迁移

2023-11-10 来源:哗拓教育

最近有一张2000W条记录的数据表需要优化和迁移。2000W数据对于MySQL来说很尴尬,因为合理的创建索引速度还是挺快的,再怎么优化速度也得不到多大提升。不过这些数据有大量的冗余字段和错误信息,极不方便做统计和分析。所以我需要创建一张新表,把旧表中的数据一条一条取出来优化后放回新表;

一. 清除冗余数据,优化字段结构

2000W数据中,能作为查询条件的字段我们是预知的。所以将这部分数据单独创建新的字段,对于有规则的数据合理改变字段结构,比如身份证就是varchar(18)。对于不重要的数据我们合并后存在一个结构为text的字段。

对于一些有关联的数据我们需要计算,常见的比如身份证种能获取到准确的性别,出生地、生日、年龄。

二. 数据迁移

我们从数据库中取出一条旧数据,再通过计算处理后得到想要的新数据(腾云科技ty300.com),最后将新数据插入新表。不过在获取新数据时遇到如下问题。

1. 数据量太大,无法一次获取(2000W数据扔到内存挺可怕的);

我们可以通过MySQL的limit语法分批获取。比如每次获取50000,SQL语句如下:

select * from table_name limit 15000000,50000;

通过这种方法能解决数据量太大的问题,但是随着limit的第一个参数越来越大,查询速度会慢的吓人(上面这条SQL执行会花35秒)。时间就是生命,于是我们开始优化SQL语句,优化后变成下面这样:

稿源:勤快学QKXue.NET

完整版MySQL两千万数据优化&迁移介绍

MySQL两千万数据优化&迁移

标签:

小编还为您整理了以下内容,可能对您也有帮助:

Mysql某个表有近千万数据,CRUD比较慢,如何优化?

数据千万级别之多,占用的存储空间也比较大,可想而知它不会存储在一块连续的物理空间上,而是链式存储在多个碎片的物理空间上。可能对于长字符串的比较,就用更多的时间查找与比较,这就导致用更多的时间。

可以做表拆分,减少单表字段数量,优化表结构。

在保证主键有效的情况下,检查主键索引的字段顺序,使得查询语句中条件的字段顺序和主键索引的字段顺序保持一致。

主要两种拆分 垂直拆分,水平拆分。

垂直分表

也就是“大表拆小表”,基于列字段进行的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。 一般是针对 那种 几百列的大表,也避免查询时,数据量太大造成的“跨页”问题。

垂直分库针对的是一个系统中的不同业务进行拆分,比如用户User一个库,商品Proct一个库,订单Order一个库。 切分后,要放在多个服务器上,而不是一个服务器上。为什么? 我们想象一下,一个购物网站对外提供服务,会有用户,商品,订单等的CRUD。没拆分之前, 全部都是落到单一的库上的,这会让数据库的单库处理能力成为瓶颈。按垂直分库后,如果还是放在一个数据库服务器上, 随着用户量增大,这会让单个数据库的处理能力成为瓶颈,还有单个服务器的磁盘空间,内存,tps等非常吃紧。 所以我们要拆分到多个服务器上,这样上面的问题都解决了,以后也不会面对单机资源问题。

数据库业务层面的拆分,和服务的“治理”,“降级”机制类似,也能对不同业务的数据分别的进行管理,维护,监控,扩展等。 数据库往往最容易成为应用系统的瓶颈,而数据库本身属于“有状态”的,相对于Web和应用服务器来讲,是比较难实现“横向扩展”的。 数据库的连接资源比较宝贵且单机处理能力也有限,在高并发场景下,垂直分库一定程度上能够突破IO、连接数及单机硬件资源的瓶颈。

水平分表

针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。不建议采用。

水平分库分表

将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。

水平分库分表切分规则

1. RANGE

从0到10000一个表,10001到20000一个表;

2. HASH取模

一个商场系统,一般都是将用户,订单作为主表,然后将和它们相关的作为附表,这样不会造成跨库事务之类的问题。 取用户id,然后hash取模,分配到不同的数据库上。

3. 地理区域

比如按照华东,华南,华北这样来区分业务,七牛云应该就是如此。

4. 时间

按照时间切分,就是将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据 被查询的概率变小,所以没必要和“热数据”放在一起,这个也是“冷热数据分离”。

分库分表后面临的问题

事务支持

分库分表后,就成了分布式事务了。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价; 如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。

跨库join

只要是进行切分,跨节点Join的问题是不可避免的。但是良好的设计和切分却可以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据。

跨节点的count,order by,group by以及聚合函数问题

这些是一类问题,因为它们都需要基于全部数据集合进行计算。多数的代理都不会自动处理合并工作。解决方案:与解决跨节点join问题的类似,分别在各个节点上得到结果后在应用程序端进行合并。和join不同的是每个结点的查询可以并行执行,因此很多时候它的速度要比单一大表快很多。但如果结果集很大,对应用程序内存的消耗是一个问题。

数据迁移,容量规划,扩容等问题

来自淘宝综合业务平台团队,它利用对2的倍数取余具有向前兼容的特性(如对4取余得1的数对2取余也是1)来分配数据,避免了行级别的数据迁移,但是依然需要进行表级别的迁移,同时对扩容规模和分表数量都有。总得来说,这些方案都不是十分的理想,多多少少都存在一些缺点,这也从一个侧面反映出了Sharding扩容的难度。

ID问题

一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键生成机制。一方面,某个分区数据库自生成的ID无法保证在全局上是唯一的;另一方面,应用程序在插入数据之前需要先获得ID,以便进行SQL路由.

一些常见的主键生成策略

UUID

使用UUID作主键是最简单的方案,但是缺点也是非常明显的。由于UUID非常的长,除占用大量存储空间外,最主要的问题是在索引上,在建立索引和基于索引进行查询时都存在性能问题。

Twitter的分布式自增ID算法Snowflake

在分布式系统中,需要生成全局UID的场合还是比较多的,的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位 机器ID 10位 毫秒内序列12位。

跨分片的排序分页

一般来讲,分页时需要按照指定字段进行排序。当排序字段就是分片字段的时候,我们通过分片规则可以比较容易定位到指定的分片,而当排序字段非分片字段的时候,情况就会变得比较复杂了。为了最终结果的准确性,我们需要在不同的分片节点中将数据进行排序并返回,并将不同分片返回的结果集进行汇总和再次排序,最后再返回给用户。

MySQL 对于千万级的大表要怎么优化

第一优化你的sql和索引;

第二加缓存,memcached,redis;

第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护;

第四如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑,在这里就不多说了;

第五如果以上都做了,那就先做垂直拆分,其实就是根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;

第六才是水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;

mysql对千万级的大表怎么优化

MySQL 对于千万级的大表的优化:
常用的优化sql----突出快字,使完成操作的时间最短
1、用索引提高效率:
2、选择有效率的表名顺序,及数据结构及字段;
3、使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表;
4、删除重复记;
5、过内部函数提高SQL效率;......
读写分离-----操作不在一个表里完成
1、主数据库A,进行事务性增、改、删操作(INSERT、UPDATE、DELETE);
2、从数据库B,进行SELECT查询操作;
3、A复制到B,使数据保持一致性;
垂直划分 ------数据不存储在一个服务器里
按照功能划分,把数据分别放到不同的数据库和服务器。如博客功能的放到服务器A,储存文件放到服务器B;
水平划分------相同数据结构的数据不放在一张表里
把一个表的数据根据一定的规则划分到不同的数据库,两个数据库的表结构一样。
数据归档处理-----时间优先原则存储读取
将数据库中不经常使用的数据迁移至近线设备,将长期不使用的数据迁移至文件形式归档。这样,随着应用的需要,数据会在在线、近线和文件文档之间移动,如当应用需要访问很久以前的某些数据,它们的物理位置在近线设备,则会自动移动到在线设备。对用户的应用而言,这些都是透明的,就像所有数据都存放在在线设备一样,不会对数据库应用产生任何影响。

mysql对千万级的大表怎么优化

MySQL 对于千万级的大表的优化:
常用的优化sql----突出快字,使完成操作的时间最短
1、用索引提高效率:
2、选择有效率的表名顺序,及数据结构及字段;
3、使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表;
4、删除重复记;
5、过内部函数提高SQL效率;......
读写分离-----操作不在一个表里完成
1、主数据库A,进行事务性增、改、删操作(INSERT、UPDATE、DELETE);
2、从数据库B,进行SELECT查询操作;
3、A复制到B,使数据保持一致性;
垂直划分 ------数据不存储在一个服务器里
按照功能划分,把数据分别放到不同的数据库和服务器。如博客功能的放到服务器A,储存文件放到服务器B;
水平划分------相同数据结构的数据不放在一张表里
把一个表的数据根据一定的规则划分到不同的数据库,两个数据库的表结构一样。
数据归档处理-----时间优先原则存储读取
将数据库中不经常使用的数据迁移至近线设备,将长期不使用的数据迁移至文件形式归档。这样,随着应用的需要,数据会在在线、近线和文件文档之间移动,如当应用需要访问很久以前的某些数据,它们的物理位置在近线设备,则会自动移动到在线设备。对用户的应用而言,这些都是透明的,就像所有数据都存放在在线设备一样,不会对数据库应用产生任何影响。

mysql千万级数据update怎么优化

提问:何设计或优化千万级别表外其信息觉题点范简单说该何做于存储设计必须考虑业务特点收集信息:
1.数据容量:1-3内概少条数据每条数据概少字节;
2.数据项:否字段些字段值否经更新;
3.数据查询SQL条件:哪些数据项列名称经现WHERE、GROUP BY、ORDER BY句等;
4.数据更新类SQL条件:少列经现UPDATE或DELETE WHERE句;
5.SQL量统计比:SELECT:UPDATE+DELETE:INSERT=少
6.预计表及相关联SQL每总执行量何数量级
7.表数据:更新主业务 查询主业务
8.打算采用数据库物理服务器及数据库服务器架构
9.并发何
10.存储引擎选择InnoDBMyISAM

致明白10问题至于何设计类表应该都清楚

至于优化若指创建表能变表结构建议InnoDB引擎利用点内存减轻磁盘IO负载IO往往数据库服务器瓶颈

另外优化索引结构解决性能问题建议优先考虑修改类SQL语句使更快些已靠索引组织结构式前提 索引已经创建非若读主考虑打query_cache 及调整些参数值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_siz
更信息参见:
MySQL数据库服务器端核参数详解推荐配置
纸谈兵说我思路及我解决抛砖引玉
我近解决问题
我现公司三张表5亿数据每张表每增量100w
每张表概10columns左右
面我做测试比
1.首先看engine,数据量情况没做区情况
mysiam比innodb读情况效率要高13%左右
2.做partition读mysql官文档其实于partition专门myisam做优化于innodb所数据存ibdata面所即使看schema变其实没本质变化
区于同physical disk面情况提升概1%
区同physical disk我三同disks提升概3%其实所谓吞吐量由素决定比explain parition候看record区每区都其实本质没解决读问题提升写效率
另外问题于区张表三column都经用于做查询条件其实件悲惨事情没办所sql做针性区mysql官文档说间做区且用间查询恭喜
3.表主要用读写其实问题充应该问写入候同并发查询我问题比较简单mongodb shredding支持能crushmysql所通情况9am-9pm写入情况候我做 viewview基于近插入或者经查询通做view离读取说写table读进行逻辑判断前view操作
4做些archive table比先些表做已统计析通已析+增量解决
5用mysiam问题要注意.configure候加max index length参数候record数于制定度候indexdisable

mysql千万级数据update怎么优化

提问:何设计或优化千万级别表外其信息觉题点范简单说该何做于存储设计必须考虑业务特点收集信息:
1.数据容量:1-3内概少条数据每条数据概少字节;
2.数据项:否字段些字段值否经更新;
3.数据查询SQL条件:哪些数据项列名称经现WHERE、GROUP BY、ORDER BY句等;
4.数据更新类SQL条件:少列经现UPDATE或DELETE WHERE句;
5.SQL量统计比:SELECT:UPDATE+DELETE:INSERT=少
6.预计表及相关联SQL每总执行量何数量级
7.表数据:更新主业务 查询主业务
8.打算采用数据库物理服务器及数据库服务器架构
9.并发何
10.存储引擎选择InnoDBMyISAM

致明白10问题至于何设计类表应该都清楚

至于优化若指创建表能变表结构建议InnoDB引擎利用点内存减轻磁盘IO负载IO往往数据库服务器瓶颈

另外优化索引结构解决性能问题建议优先考虑修改类SQL语句使更快些已靠索引组织结构式前提 索引已经创建非若读主考虑打query_cache 及调整些参数值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_siz
更信息参见:
MySQL数据库服务器端核参数详解推荐配置
纸谈兵说我思路及我解决抛砖引玉
我近解决问题
我现公司三张表5亿数据每张表每增量100w
每张表概10columns左右
面我做测试比
1.首先看engine,数据量情况没做区情况
mysiam比innodb读情况效率要高13%左右
2.做partition读mysql官文档其实于partition专门myisam做优化于innodb所数据存ibdata面所即使看schema变其实没本质变化
区于同physical disk面情况提升概1%
区同physical disk我三同disks提升概3%其实所谓吞吐量由素决定比explain parition候看record区每区都其实本质没解决读问题提升写效率
另外问题于区张表三column都经用于做查询条件其实件悲惨事情没办所sql做针性区mysql官文档说间做区且用间查询恭喜
3.表主要用读写其实问题充应该问写入候同并发查询我问题比较简单mongodb shredding支持能crushmysql所通情况9am-9pm写入情况候我做 viewview基于近插入或者经查询通做view离读取说写table读进行逻辑判断前view操作
4做些archive table比先些表做已统计析通已析+增量解决
5用mysiam问题要注意.configure候加max index length参数候record数于制定度候indexdisable

mysql优化高手进200万条数据

1. 尽量不使用*,而是需要什么才写出来
2. 添加索引/主键,这样mysql会先搜索索引再读取其它数据
3. 加上条件语句(Where)。条件语句最好使用索引
4. 分表。例如按照100000条数据一个表。分的方法可以按时间,因为通常旧的很少用到。可以按类别,通常只搜索同类别下的内容。这样需要在搜索前判断一个用哪个表。也需要建一个包含所有信息的表,因为有时必须从全部里查询。这是超大数据最见效的方法

mysql优化高手进200万条数据

1. 尽量不使用*,而是需要什么才写出来
2. 添加索引/主键,这样mysql会先搜索索引再读取其它数据
3. 加上条件语句(Where)。条件语句最好使用索引
4. 分表。例如按照100000条数据一个表。分的方法可以按时间,因为通常旧的很少用到。可以按类别,通常只搜索同类别下的内容。这样需要在搜索前判断一个用哪个表。也需要建一个包含所有信息的表,因为有时必须从全部里查询。这是超大数据最见效的方法

mysql对于大量数据,怎么进行优化

1)调整服务器的性能参数:key_buffer_size、Innodb_buffer_pool_size进行合理的配置
2)建立合适的索引
3)写查询语句用explain分析一下执行过程,核实一下执行计划,是否按照自己的意愿执行。
索引使要注意的地方:
1)索引不会包含有NULL值的列(使用索引的列设需要置默认值) 2)使用短索引 3)不要在列上进行运算,即操作符号左端(使用函数) 4) like语句操作 5)不使用NOT IN和<>操作 6)复合索引的建立 7)选择自己使用的索引: USE INDEX  , IGNORE INDEX  , FORCE INDEX  8) where子句中已经使用了索引的话,那么order by中的列是不会使用索引的(使用复合索引解决)
表扫描要注意的地方:
1)数据表很小,全表扫描比做索引键的查找来得快。当表的记录总数小于10且比较短时通常这么做。
2)没有合适用于 ON 或 WHERE 分句的索引字段。
3)让索引字段和常量值比较,MySQL已经计算(基于索引树)到常量覆盖了数据表的很大部分。
4)通过其他字段使用了一个基数很小(很多记录匹配索引键值)的索引键。这种情况下,MySQL认为使用索引键需要大量查找,还不如全表扫描来得更快。
5)使用合适的索引可以解决表扫描
6) 使用Limit有时候也可以解决表扫描
优化的地方太多了,一一列举不完,你可以去这里看一下,这里面关于优化的知识有很多
http://www.quzixi.com/forum-2-2.html,如果觉得说的有用就给个好评,写这么多怪不容易的,用了我一刻钟的时间呀

mysql对于大量数据,怎么进行优化

1)调整服务器的性能参数:key_buffer_size、Innodb_buffer_pool_size进行合理的配置
2)建立合适的索引
3)写查询语句用explain分析一下执行过程,核实一下执行计划,是否按照自己的意愿执行。
索引使要注意的地方:
1)索引不会包含有NULL值的列(使用索引的列设需要置默认值) 2)使用短索引 3)不要在列上进行运算,即操作符号左端(使用函数) 4) like语句操作 5)不使用NOT IN和<>操作 6)复合索引的建立 7)选择自己使用的索引: USE INDEX  , IGNORE INDEX  , FORCE INDEX  8) where子句中已经使用了索引的话,那么order by中的列是不会使用索引的(使用复合索引解决)
表扫描要注意的地方:
1)数据表很小,全表扫描比做索引键的查找来得快。当表的记录总数小于10且比较短时通常这么做。
2)没有合适用于 ON 或 WHERE 分句的索引字段。
3)让索引字段和常量值比较,MySQL已经计算(基于索引树)到常量覆盖了数据表的很大部分。
4)通过其他字段使用了一个基数很小(很多记录匹配索引键值)的索引键。这种情况下,MySQL认为使用索引键需要大量查找,还不如全表扫描来得更快。
5)使用合适的索引可以解决表扫描
6) 使用Limit有时候也可以解决表扫描
优化的地方太多了,一一列举不完,你可以去这里看一下,这里面关于优化的知识有很多
http://www.quzixi.com/forum-2-2.html,如果觉得说的有用就给个好评,写这么多怪不容易的,用了我一刻钟的时间呀

MySQL 对于千万级的大表要怎么优化

提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下:

1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节;

2.数据项:是否有大字段,那些字段的值是否经常被更新;

3.数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、ORDER BY子句中等;

4.数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中;

5.SQL量的统计比,如:SELECT:UPDATE+DELETE:INSERT=多少?

6.预计大表及相关联的SQL,每天总的执行量在何数量级?

7.表中的数据:更新为主的业务 还是 查询为主的业务

8.打算采用什么数据库物理服务器,以及数据库服务器架构?

9.并发如何?

10.存储引擎选择InnoDB还是MyISAM?

大致明白以上10个问题,至于如何设计此类的大表,应该什么都清楚了!

至于优化若是指创建好的表,不能变动表结构的话,那建议InnoDB引擎,多利用点内存,减轻磁盘IO负载,因为IO往往是数据库服务器的瓶颈。

另外对优化索引结构去解决性能问题的话,建议优先考虑修改类SQL语句,使他们更快些,不得已只靠索引组织结构的方式,当然此话前提是, 索引已经创建的非常好,若是读为主,可以考虑打开query_cache, 以及调整一些参数值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_siz。

更多信息参见:

MySQL数据库服务器端核心参数详解和推荐配置

不纸上谈兵,说一下我的思路以及我的解决,抛砖引玉了

我最近正在解决这个问题

我现在的公司有三张表,是5亿的数据,每天张表每天的增量是100w

每张表大概在10个columns左右

下面是我做的测试和对比

1.首先看engine,在大数据量情况下,在没有做分区的情况下

mysiam比innodb在只读的情况下,效率要高13%左右

2.在做了partition之后,你可以去读一下mysql的官方文档,其实对于partition,专门是对myisam做的优化,对于innodb,所有的数据是存在ibdata里面的,所以即使你可以看到schema变了,其实没有本质的变化

在分区出于同一个physical disk下面的情况下,提升大概只有1%

在分区在不同的physical disk下,我分到了三个不同的disks下,提升大概在3%,其实所谓的吞吐量,由很多因素决定的,比如你的explain parition时候可以看到,record在那一个分区,如果每个分区都有,其实本质上没有解决读的问题,这样只会提升写的效率。

另外一个问题在于,分区,你怎么分,如果一张表,有三个column都是经常被用于做查询条件的,其实是一件很悲惨的事情,因为你没有办法对所有的sql做针对性的分区,如果你只是如mysql官方文档上说的,只对时间做一个分区,而且你也只用时间查询的话,恭喜你

3.表主要用来读还是写,其实这个问题是不充分的,应该这样问,你在写入的时候,同时并发的查询多么?我的问题还比较简单,因为mongodb的 shredding支持不能,在crush之后,还是回到mysql,所以在通常情况下,9am-9pm,写入的情况很多,这个时候我会做一个 view,view是基于最近被插入或者经常被查询的,通过做view来分离读取,就是说写是在table上的,读在进行逻辑判断前是在view上操作的

4做一些archive table,比如先对这些大表做很多已有的统计分析,然后通过已有的分析+增量来解决

5如果你用mysiam,还有一个问题你要注意,如果你的.configure的时候,加了一个max index length参数的时候,当你的record数大于制定长度的时候,这个index会被disable

怎么进行mysql数据库优化?

有八个方面可以对mysql进行优化:
1、选取最适用的字段属性
MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。
2. 使用连接(JOIN)来代替子查询(Sub-Queries)
MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。
3、使用联合(UNION)来代替手动创建的临时表
MySQL从4.0的版本开始支持union查询,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。
4、事务
尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创建各种各样的查询,但不是所有的数据库操作都可以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下,当这个语句块中的某一条语句运行出错的时候,整个语句块的操作就会变得不确定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败
5、锁定表
尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。其实,有些情况下我们可以通过锁定表的方法来获得更好的性能。
6、使用外键
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。
7、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。
8、优化的查询语句
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。

怎么进行mysql数据库优化?

有八个方面可以对mysql进行优化:
1、选取最适用的字段属性
MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。
2. 使用连接(JOIN)来代替子查询(Sub-Queries)
MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。
3、使用联合(UNION)来代替手动创建的临时表
MySQL从4.0的版本开始支持union查询,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。
4、事务
尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创建各种各样的查询,但不是所有的数据库操作都可以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下,当这个语句块中的某一条语句运行出错的时候,整个语句块的操作就会变得不确定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败
5、锁定表
尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。其实,有些情况下我们可以通过锁定表的方法来获得更好的性能。
6、使用外键
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。
7、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。
8、优化的查询语句
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。

批量向MySQL导入1000万条数据的优化

1.用start transaction关闭mysql的自动提交,合理设置插入批量大小,不要一条数据提交一次。

2.修改表的存储引擎InnoDB为MyISAM。(因为InnoDB中存在redo log日志,每次更新表的结果先写入redo log中,等redo log满了之后再写入磁盘而这个过程是会停止其他所有的事务)

3.优化SQL(一条SQL语句插入多条数据)

4.尽量顺序插入(存储引擎底层采用的数据结构是B+tree索引,如果每次插入记录都在索引的最后面,索引的定位效率很高,并且对索引调整较小;如果插入的记录在索引中间,则需要维护B+tree并且索引定位效率会下降,数据量较大时会有频繁的磁盘操作)

mysql数据库中,数据量很大的表,有什么优化方案么?

个人的观点,这种大表的优化,不一定上来就要分库分表,因为表一旦被拆分,开发、运维的复杂度会直线上升,而大多数公司是欠缺这种能力的。所以MySQL中几百万甚至小几千万的表,先考虑做单表的优化。

单表优化

单表优化可以从这几个角度出发:

表分区:MySQL在5.1之后才有的,可以看做是水平拆分,分区表需要在建表的需要加上分区参数,用户需要在建表的时候加上分区参数;分区表底层由多个物理子表组成,但是对于代码来说,分区表是透明的;SQL中的条件中最好能带上分区条件的列,这样可以定位到少量的分区上,否则就会扫描全部分区。

读写分离:最常用的优化手段,写主库读从库;

增加缓存:主要的思想就是减少对数据库的访问,缓存可以在整个架构中的很多地方,比如:数据库本身有就缓存,客户端缓存,数据库访问层对SQL语句的缓存,应用程序内的缓存,第三方缓存(如Redis等);

字段设计:单表不要有太多字段;VARCHAR的长度尽量只分配真正需要的空间;尽量使用TIMESTAMP而非DATETIME;避免使用NULL,可以通过设置默认值解决。

索引优化:索引不是越多越好,针对性地建立索引,索引会加速查询,但是对新增、修改、删除会造成一定的影响;值域很少的字段不适合建索引;尽量不用UNIQUE,不要设置外键,由程序保证;

SQL优化:尽量使用索引,也要保证不要因为错误的写法导致索引失效;比如:避免前导模糊查询,避免隐式转换,避免等号左边做函数运算,in中的元素不宜过多等等;

NoSQL:有一些场景,可以抛弃MySQL等关系型数据库,拥抱NoSQL;比如:统计类、日志类、弱结构化的数据;事务要求低的场景。

表拆分

数据量进一步增大的时候,就不得不考虑表拆分的问题了:

垂直拆分:垂直拆分的意思就是把一个字段较多的表,拆分成多个字段较少的表;上文中也说过单表的字段不宜过多,如果初期的表结构设计的就很好,就不会有垂直拆分的问题了;一般来说,MySQL单表的字段最好不要超过二三十个。

水平拆分:就是我们常说的分库分表了;分表,解决了单表数据过大的问题,但是毕竟还在同一台数据库服务器上,所以IO、CPU、网络方面的压力,并不会得到彻底的缓解,这个可以通过分库来解决。水平拆分优点很明显,可以利用多台数据库服务器的资源,提高了系统的负载能力;缺点是逻辑会变得复杂,跨节点的数据关联性能差,维护难度大(特别是扩容的时候)。

希望我的回答,能够帮助到你!我将持续分享Java开发、架构设计、程序员职业发展等方面的见解。

Top