北大青鸟设计培训:mysql数据库的优化方法?我们都知道,服务器数据库的开发一般都是通过java或者是PHP语言来编程实现的,而为了提高我们数据库的运行速度和效率,数据库优化也成为了我们每日的工作重点,今天,昌平IT培训就一起来了解一下mysql服务器数据库的优化方法 。
为什么要了解索引真实案例案例一:大学有段时间学习爬虫,爬取了知乎300w用户答题数据,存储到mysql数据中 。
那时不了解索引,一条简单的“根据用户名搜索全部回答的sql“需要执行半分钟左右,完全满足不了正常的使用 。
案例二:近线上应用的数据库频频出现多条慢sql风险提示 , 而工作以来,对数据库优化方面所知甚少 。
例如一个用户数据页面需要执行很多次数据库查询,性能很慢 , 通过增加超时时间勉强可以访问,但是性能上需要优化 。
索引的优点合适的索引,可以大大减小mysql服务器扫描的数据量,避免内存排序和临时表,提高应用程序的查询性能 。
索引的类型mysql数据中有多种索引类型,primarykey,unique,normal,但底层存储的数据结构都是BTREE;有些存储引擎还提供hash索引,全文索引 。
BTREE是常见的优化要面对的索引结构,都是基于BTREE的讨论 。
B-TREE查询数据简单暴力的方式是遍历所有记录;如果数据不重复,就可以通过组织成一颗排序二叉树,通过二分查找算法来查询,大大提高查询性能 。
而BTREE是一种更强大的排序树,支持多个分支 , 高度更低,数据的插入、删除、更新更快 。
现代数据库的索引文件和文件系统的文件块都被组织成BTREE 。
btree的每个节点都包含有key,data和只想子节点指针 。
btree有度的概念d=1 。
假设btree的度为d,则每个内部节点可以有n=[d 1,2d 1)个key,n 1个子节点指针 。
树的大高度为h=Logb[(N 1)/2] 。
索引和文件系统中,B-TREE的节点常设计成接近一个内存页大小(也是磁盘扇区大小),且树的度非常大 。
这样磁盘I/O的次数,就等于树的高度h 。
假设b=100,一百万个节点的树,h将只有3层 。
即,只有3次磁盘I/O就可以查找完毕,性能非常高 。
索引查询建立索引后 , 合适的查询语句才能大发挥索引的优势 。
另外,由于查询优化器可以解析客户端的sql语句,会调整sql的查询语句的条件顺序去匹配合适的索引 。
超详细MySQL数据库优化 数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷.
【mysql怎么做数据优化 mysql数据优化方案】1. 优化一览图
2. 优化
笔者将优化分为了两大类,软优化和硬优化,软优化一般是操作数据库即可,而硬优化则是操作服务器硬件及参数设置.
2.1 软优化
2.1.1 查询语句优化
1.首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息.
2.例:
显示:
其中会显示索引和查询数据读取数据条数等信息.
2.1.2 优化子查询
在MySQL中,尽量使用JOIN来代替子查询.因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高.
2.1.3 使用索引
索引是提高数据库查询速度最重要的方法之一,关于索引可以参高笔者MySQL数据库索引一文,介绍比较详细,此处记录使用索引的三大注意事项:
2.1.4 分解表
对于字段较多的表,如果某些字段使用频率较低,此时应当,将其分离出来从而形成新的表,
2.1.5 中间表
对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时.
2.1.6 增加冗余字段
类似于创建中间表,增加冗余也是为了减少连接查询.
2.1.7 分析表,,检查表,优化表
分析表主要是分析表中关键字的分布,检查表主要是检查表中是否存在错误,优化表主要是消除删除或更新造成的表空间浪费.
1. 分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user;
2. 检查表: 使用 CHECK关键字,如CHECK TABLE user [option]
option 只对MyISAM有效,共五个参数值:
3. 优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;
LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志.,优化表只对VARCHAR,BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁.
2.2 硬优化
2.2.1 硬件三件套
1.配置多核心和频率高的cpu,多核心可以执行多个线程.
2.配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度.
3.配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行操作的能力.
2.2.2 优化数据库参数
优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能.MySQL服务的配置参数都在my.cnf或my.ini,下面列出性能影响较大的几个参数.
2.2.3 分库分表
因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响 。另外一个,压力过大把你的数据库给搞挂了怎么办?所以此时你必须得对系统做分库分表读写分离 , 也就是把一个库拆分为多个库 , 部署在多个数据库服务上,这时作为主库承载写入请求 。然后每个主库都挂载至少一个从库,由从库来承载读请求 。
2.2.4 缓存集群
如果用户量越来越大 , 此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求 。然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库 。但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的 , 所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置 , 比较昂贵的机器,成本很高 。如果你就是简单的不停的加机器,其实是不对的 。所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生 。所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级 。所以你完全可以根据系统的业务特性 , 对那种写少读多的请求,引入缓存集群 。具体来说,就是在写数据库的时候同时写一份数据到缓存集群里 , 然后用缓存集群来承载大部分的读请求 。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发 。
一个完整而复杂的高并发系统架构中 , 一定会包含:各种复杂的自研基础架构系统 。各种精妙的架构设计.因此一篇小文顶多具有抛砖引玉的效果,但是数据库优化的思想差不多就这些了.
Mysql某个表有近千万数据 , CRUD比较慢,如何优化? 数据千万级别之多,占用的存储空间也比较大,可想而知它不会存储在一块连续的物理空间上,而是链式存储在多个碎片的物理空间上 。可能对于长字符串的比较,就用更多的时间查找与比较,这就导致用更多的时间 。
可以做表拆分,减少单表字段数量 , 优化表结构 。
在保证主键有效的情况下,检查主键索引的字段顺序,使得查询语句中条件的字段顺序和主键索引的字段顺序保持一致 。
主要两种拆分 垂直拆分,水平拆分 。
垂直分表
也就是“大表拆小表”,基于列字段进行的 。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“ 。一般是针对 那种 几百列的大表 , 也避免查询时,数据量太大造成的“跨页”问题 。
垂直分库针对的是一个系统中的不同业务进行拆分,比如用户User一个库 , 商品Product一个库,订单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的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息 , 核心代码就是毫秒级时间41位 机器ID 10位 毫秒内序列12位 。
跨分片的排序分页
一般来讲,分页时需要按照指定字段进行排序 。当排序字段就是分片字段的时候,我们通过分片规则可以比较容易定位到指定的分片,而当排序字段非分片字段的时候 , 情况就会变得比较复杂了 。为了最终结果的准确性,我们需要在不同的分片节点中将数据进行排序并返回 , 并将不同分片返回的结果集进行汇总和再次排序,最后再返回给用户 。
mysql怎么做数据优化的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql数据优化方案、mysql怎么做数据优化的信息别忘了在本站进行查找喔 。
推荐阅读
- GIS是什么发色不会化妆,gis是什么意思中文翻译
- 日本服务器脚本怎么用,服务器 日本
- 杯子蛋糕教程直播,杯子蛋糕步骤
- vb翻译成vb.net vb做中文翻译英文
- js自定义排序函数,js 自定义排序
- python填充单元格颜色代码,python中填充颜色的函数
- 关于美国服务器就要用科捷16的信息
- vb.net用什么书 vbnet语言
- redis重启客户端命令,redis重启命令行