mysql海量数据的优化
下面是一部分比较重要的建议:
1、选择正确的存储引擎
以 MySQL为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
2、优化字段的数据类型
记住一个原则,越小的列会越快。对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈。所以,把你的数据变得紧凑会对这种情况非常有帮助,因为这减少了对硬盘的访问。
如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多。当然,你也需要留够足够的扩展空间。
3、为搜索字段添加索引
索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么最好是为其建立索引,除非你要搜索的字段是大的文本字段,那应该建立全文索引。
4、避免使用Select *从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。即使你要查询数据表的所有字段,也尽量不要用*通配符,善用内置提供的字段排除定义也许能给带来更多的便利。
5、使用 ENUM 而不是 VARCHAR
ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。
6、尽可能的使用 NOT NULL
除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。 NULL其实需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。
7、固定长度的表会更快
如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。
固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。
并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。
使用“垂直分割”技术,你可以分割你的表成为两个一个是定长的,一个则是不定长的。
8、垂直分割“垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。
例如:在User表中有一个字段是家庭地址,这个字段是可选字段,相比起,而且你在数据库操作的时候除了个人信息外,你并不需要经常读取或是改写这个字段。那么,为什么不把他放到另外一张表中呢? 这样会让你的表有更好的性能,大家想想是不是,大量的时候,我对于用户表来说,只有用户ID,用户名,口令,用户角色等会被经常使用。小一点的表总是会有好的性能。
另外,你需要注意的是,这些被分出去的字段所形成的表,你不会经常性地去Join他们,不然的话,这样的性能会比不分割时还要差,而且,会是极数级的下降。
9、EXPLAIN 你的 SELECT 查询;
使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的……等等,等等。
通常我们可以对比较复杂的尤其是涉及到多表的SELECT语句,把关键字EXPLAIN加到前面。
插入大量数据的优化:
1。使用多行插入代替单行插入操作。比单条插入快很多;另外,加大bulk_insert_buffer_size的值,例如设置为64M(在MYISAM引擎下)
insert into t values(),(),();
2.使用LOAD DATA INFILE .......INTO TABLE ..比插入同样多行的insert语句快
3.对使用InnoDB存储引擎的表,你可以在一个事务中完成insert操作,这样InoDB将在事务,结束时刷新改变。而不是每一条insert语句后都刷新改变。同样的操作可以应用到update。
4.如果是非空表,使用alter table table_name disable keys,然后load data infile,导入完数据在执行:
alter table table_name enable keys. 如果是空表,就不需要这个操作,因为myisam表在空表中导入数据时,是先导入数据然后建立indexs。
例如下面一段代码,关闭事务commit,等待更新完成后再一次性提交,可以将原来10几个小时的工作变成10几分钟。这里读的是一个700多万行的文件,更新记录约300多万条。
my $db_handle = DBI->connect("DBI:mysql:database=$database;host=$host", $db_user, $db_pass, {'RaiseError' => 1,AutoCommit => 0})|| die "Could not connect to database: $DBI::errstr";eval {while( !eof($fd) ){$CloudID = <$fd> ;chomp $CloudID;$crc_code = <$fd> ;chomp $crc_code;my $sql = "call `room_match`.`crcWriteCode`($CloudID,'$crc_code');" ;my $affect_rows = $db_handle->do($sql);}$db_handle->commit();};
开始的时候是第一次都执行sql,这样速度极慢!设置 autocommit = 0,再 commit后,速度极大提升。
mysql海量数据的优化相关推荐
- 一起进阶学习JAVA:MySQL海量数据存储与优化
一起进阶学习JAVA:MySQL海量数据存储与优化 第一部分 分库分表实战及中间件 1.1 背景介绍 1.1.1 背景描述 刚开始我们的系统只用了 单机数据库 随着用户的不断增多,考虑到系统的高可用和 ...
- MySQL海量数据优化(理论+实战)
MySQL海量数据优化(理论+实战) 让面试官哑口无言 前言 一.准备表数据 二.优化方式 1.分页查询优化 2.普通索引优化 3.复合索引优化 4.SQL查询优化 5.事务优化 6.数据库性能优化 ...
- MySQL海量数据存储与优化(上)
MySQL起源和分支 MySQL 是最流行的关系型数据库软件之一,由于其体积小.速度快.开源免费.简单易用.维护成本 低等,在集群架构中易于扩展.高可用,因此深受开发者和企业的欢迎. Oracle和M ...
- 分布式存储系统——《MySQL海量数据存储与优化》
文章目录 前言介绍 必备基础 主要内容 MySQL起源和分支 MySQL应用架构演变 MySQL架构原理 MySQL架构体系 MySQL运行机制 MySQL存储引擎 InnoDB和MyISAM对比 I ...
- 百万级数据量,千万级数据量是多少,海量数据的优化方案
百万级数据量,千万级数据量是多少? 这里的百万级,千万级,针对数据库,指的是表的数据条数.有时也指并发事务量. 海量数据的优化方案 Note: 具体优化要结合自身的业务特性 百万级: 这个数据量 ...
- MySQL高并发优化指南(万能通用),稳的一批~
先问大家一个问题:你是什么时候接触的MySQL?或者说是什么原因MySQL进入你的视野? 作为目前全世界最流行的开源数据库,从Yahoo.Google等大网站,到零售业.制造业.政府部门和学校的内部任 ...
- 这篇讲MySQL海量数据分库分表的,实在太过瘾了!
孙玄,前58同城技术委员会主席,前转转首席架构师,绝对业界大佬,资深架构师. 最近和玄姐聊技术,对架构的认知更上一层楼,下面是玄姐的一些谈话纪要. 01.怎么谈"架构"不耍流氓 前 ...
- 一入职就遇上Mysql亿级优化,方案都改了5遍
这一个月来,很多小伙伴私信问我618各大电商后端的技术,最多的是关于系统压力暴增情况下如何进行MySQL数据库优化的. 今天就结合我自己工作中的真实案例和大家分享一下吧. 前几年我待过一家创业公司,做 ...
- MySQL海量数据设计实践
MySQL海量数据设计实践 MySQL存储引擎原理拆解以及设计深度剖析 页结构 页头:记录页面的控制信息,共占56字节,包括页的左右兄弟页面指针(双向链表).页面空间使用情况等. 最小最大虚记录:比页 ...
最新文章
- Python爬取近10万条程序员招聘数据,告诉你哪类人才和技能最受热捧!
- Servlet的延迟加载和预加载
- 家用路由器支持组播吗_组播分布树及其转发模式
- react学习预备知识_在10分钟内学习React基础知识
- Python大佬利用新接口抓取微信公众号的所有文章
- java+connect+time+out_聊聊jdk httpclient的connect timeout异常
- 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号)...
- Codeforces Round #192 (Div. 1) A. Purification 贪心
- oracle查询保留小数点后三位,关于Oracle中查询的数字值的显示格式需要保留小数点后两位(或者三位,及其他位数)...
- [转]coolfire黑客入门教程系列之(四)
- 推荐一个在线视频学习、在线试题练习、在线同步考试开源系统
- 正大国际琪貨:为什么资深交易者更倾向于裸K?
- kernel 打印时间戳
- 国庆、中秋双节同庆 青岛浮山湾灯光秀启动节日模式
- 【Unity3D 灵巧小知识点】 ☀️ | UnityHub中提示 许可证过期 了怎么办?
- 丈人/丈母娘,岳父/岳母、妈/母亲/娘 的解释
- PMP项目管理备考资料都有哪些?
- UNP学习第十一章总结, 百度的www.a.shifen.com域名,getaddrinfo小发现
- STM8L051 同时使用RTC和USART通信
- 与谷歌AI领军科学家一较高下的梦想如何反应了中国对科技突破的追求?
热门文章
- Hibernate数据保存操作方法的原理对比
- 关于笔记本安装parrot和kali的一些问题(花屏,息屏,屏幕不能休眠)
- React Native 轻松集成分享功能(Android 篇)
- HDU 4430 amp; ZOJ 3665 Yukari#39;s Birthday(二分法+枚举)
- Apache URLRewrite 原理及配置实现
- 原型设计20条军规(转)
- 如何在Linux(CentOS, Debian, Fedora和Ubuntu)上安装MyCLI
- JavaScript中创建对象的方法
- npm run mock | npm run dev只能启动一个
- 机器学习技法(3)--Kernel Support Vector Machine