高并发解决方案-mysql数据库层的优化

高并发解决方案-mysql篇 1、mysql篇 高并发大多的瓶颈在后台,在存储,mysql的正常的优化方案如下: 1)代码中sql语句优化 2)数据库字段优化,索引优化 3)加缓存,redis/memcache等 4)主从,读写分离 5)分区表 6)垂直拆分,解耦模块 7)水平切分 点评: 1、1&2是最简单,也是提升效率最快的方式。也许有人说这两点你已经做的很好了,你的每条语句都命中了索引,是最高 阅读详情

数据表数据类型

数据类型介绍

数值类型

整型
tinyint, smallint, mediumint, int ,bigint(8,16,24,32,64位存储空间)
属性:unsigned
int(3) 指定显示的宽度(显示字符的个数) ,不会限制值的合法范围
属性:zerofill 
12  int (3) zerofill  012 
实数类型
float,double, decimal

decimal可存储比bigint还大的整数;可以用于存储精确的小数
float和double类型支持使用标准的浮点数进行近似计算

字符串类型

varchar,char,text,blob

varchar类型用于存储可变长字符串,它比定长更节省空间
varchar使用一个或两个额外字节记录字符串的长度,列长度小雨255字节,使用1个字节表示,否则用2个
varchar长度,如果存储内容超过指定长度,会被截断。

char是定长的,根据定义的字符串长度分配足够的空间
char会根据需要采用空格进行填充以方便比较
char适合存储很短的字符串,或者所有值都接近同一个长度
char长度,超过设定的长度,会被截断

对于经常变更的数据,char比varchar更好,char不容易产生碎片
对于非常短的列,char比varchar在存储空间上更有效率,只分配真正需要的空间,更长的列会消耗更多的内存。

尽量避免使用blob/text类型,查询会使用临时表,导致严重的性能开销。

枚举

有时可以使用枚举代替常用的字符串类型,把不重复的集合存储为一个预定义的集合,非常紧凑,把列表值压缩到一个或两个字节,内部存储的是整数。
尽量避免使用数字作为enum枚举的常量,易混乱
排序是按照内存存储的整数进行排序
枚举表会使表大小大大减小

日期和时间类型

尽量使用timestamp,比datetime空间效率更高
用整数保存时间戳的方式通常不方便处理
如果需要存储微秒,可以用bigint存储

date, time, year, datetime, timestamp
[
    YYYY-MM-DD (1000-01-01~9999-12-31)
    HH:MM:SS(-838:59:59~838:59:59)
    YYYY(1901~2155)
    YYYY-MM-DD HH:MM:SS (1000-01-01 00:00:00~9999-12-31 23:59:59)
    YYYY-MM-DD HH:MM:SS(1970-01-01 00:00:00~2037)
    
]


列属性

auto_increment, default, not null, zerofill

优化

字段使用什么数据类型更合适
字段使用什么数据类型性能更快
举例:
考虑空间、范围

tinyint smallint bigint 

考虑长度是否固定

char  手机号,md5后的密码(32位)
varchar 姓名

特定,固定的分类可以用enum,效率更快
ip 使用整型来存,可以用php内置函数转换`long2ip ip2long

索引优化

索引对性能的影响

  • 大大减少服务器需要扫描的数据量
  • 帮助服务器避免排序和临时表
  • 将随机I/O变成顺序I/O
  • 大大提高查询速度,降低写的速度,占用磁盘(缺点)

索引类型:(实现在存储引擎层)

  • 普通索引:最基本的索引,没有任何约束限制
  • 唯一索引:与普通索引类似,但是具有唯一性约束
  • 主键索引 —特殊的唯一索引,不允许有空值,一个表只能有一个主键索引
  • 组合索引:将多个列组合在一起创建索引,可以覆盖多个列
  • 外键索引 —InnoDB,保证数据一致性,完整性和实现级联操作
  • 全文索引 —MyISAM ,只能对英文进行全文索引

建立合适的索引

索引的创建原则

1.最适合索引的列是出现在WHERE子句中的列,或连接子句中的列而不是出现在SELECT关键字后的列

2.索引列的基数越大,索引的效果越好

3.对字符串进行索引,应该制定个前缀长度,可以节省大量的索引空间

4.根据情况创建复合索引,复合索引可以提高查询效率

5.避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率

6.主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用提高查询效率

  • 索引不是越多越好,在合适的字段创建合适的索引
  • 复合索引的前缀原则

索引的注意事项

  • 复合索引的前缀原则
  • like查询,%在前无法利用索引
  • column is null 也可以使用索引
  • 如果mysql估计使用索引比全表扫描更慢,会放弃使用索引
  • 如果or前的条件列有索引但是后面的没有,索引都不会 被用到
  • 字符串索引 查询时需要加上‘’,否则会出现隐式转换,无法利用索引

sql语句

优化查询过程中的数据访问

数据访问太多导致查询性能下降
确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
确定mysql服务器是否在分析大量不必要的数据行

sql注意

查询不需要的记录,使用limit解决
多表关联返回需要的指定列,不要返回全部列
返回列不用*,总是取出全部列,select * 会让优化器无法完成索引覆盖扫描的优化
重复查询的数据,可以缓存,下次直接查询缓存

是否在扫描额外的记录

使用explain来进行分析,如果发现查询需要扫描大量的数据但只返回少数的行,可以通过如下技巧去优化:

使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果

改变数据库和表的结构,修改数据表范式

重写SQL语句,让优化器可以以更优的方式执行查询

优化长难句的查询语句

变复杂为简单

MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多
使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的

切分查询

MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多
使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的

分解关联查询

可以将一条关联语句分解成多条SQL来执行
让缓存的效率更高
执行单个查询可以减少锁的竞争
在应用层做关联可以更容易对数据库进行拆分

优化特定类型的查询语句

优化count()

count(*)中的*会忽略所有的列,直接统计所有列数,因此不要使用count(列名)
MyISAM中,没有任何WHERE条件的count(*)非常快
当有WHERE条件,MyISAM的count统计不一定比其他表引擎快

优化关联查询

确定ON或者USING子句的列上有索引
确保GROUP BY和ORDER BY中只有一个表中的列,这样MySQL才有可能使用索引

优化子查询

尽可能使用关联查询来替代

优化group by 和distinct

这两种查询均可使用索引来优化,是最有效的优化方法关联查询中,使用标识列进行分组的效率会更高

如果不需要ORDER BY,进行GROUP BY时使用ORDER BY NULL,MySQL不会再进行文件排序

WITH ROLLUP超级聚合,可以挪到应用程序处理

优化limit和union

  • LIMIT偏移量大的时候,查询效率较低
    可以记录上次查询的最大ID,下次查询时直接根据该ID来查询
  • UNION ALL 的效率高于 UNION
    使用union all不会合并重复的记录行

存储引擎

InnoDB表引擎

默认事务型引擎,最重要最广泛的存储引擎,性能非常优秀
数据存储在共享表空间,可以通过配置分开
对主键查询的性能,高于其他类型存储引擎
内部做了很多优化,从磁盘读取数据时自动在内存构建hash索引
插入数据时,自动构建插入缓冲区
通过一些工具和机制支持真正的热备份
支持崩溃后的安全恢复
支持行级锁
支持外键

MyISAM表引擎

5.1以前,MyISAM是默认的存储引擎
拥有全文索引,压缩,空间函数
不支持事务和行级锁,不支持崩溃后的安全恢复
表存储在两个文件, .MYD和.MYI
设计简单,某些场景下性能很好

其他表引擎

Archive, Blackhole, CSV, Memory

尽量使用InnoDB存储引擎

数据表结构设计

分区操作

通过特定的操作对数据表进行物理拆分
对用户透明

 partition by

分库分表

水平拆分(行 - 查所有数据用union)
垂直拆分(列 - 查所有数据用join)

数据库架构

数据备份和恢复

全量备份 (mysqldump)

全量备份的代价非常高:
首先,备份文件包含数据库中的所有数据,占用的磁盘空间非常大;其次,每次备份操作都要拷贝大量数据,备份过程中会占用数据库服务器大量的 CPU、磁盘 IO 资源,并且为了保证数据一致性,还有可能会锁表,这些都会导致备份期间,数据库本身的性能严重下降。

增量备份(binlog)

原理:
MySQL 自带了 Binlog,就是一种实时的增量备份。Binlog 里面记录的就是 MySQL 数据的变更的操作日志,开启 Binlog 之后,我们对 MySQL 中的每次更新数据操作,都会被记录到 Binlog 中。Binlog 是可以回放的,回放 Binlog,就相当于把之前对数据库所有数据更新操作按照顺序重新执行了一遍,回放完成之后数据自然就恢复了。

主从复制

异步复制 (默认)

默认情况下,MySQL 采用异步复制的方式,执行事务操作的线程不会等复制 Binlog 的线程。

MySQL 主库在收到客户端提交事务的请求之后,会先写入 Binlog,然后再提交事务,更新存储引擎中的数据,事务提交完成后,给客户端返回操作成功的响应。同时,从库会有一个专门的复制线程,从主库接收 Binlog,然后把 Binlog 写到一个中继日志里面,再给主库返回复制成功的响应。

从库还有另外一个回放 Binlog 的线程,去读中继日志,然后回放 Binlog 更新存储引擎中的数据,这个过程和我们今天讨论的主从复制关系不大,所以我并没有在图中画出来。提交事务和复制这两个流程在不同的线程中执行,互相不会等待,这是异步复制。

半同步复制 ( mysql 5.7 以后支持)

同步复制

同步复制时,主库在提交事务的时候,会等待数据复制到所有从库之后,再给客户端返回响应。

同步复制这种方式在实际项目中,基本上没法用,原因有两个:
一是性能很差,因为要复制到所有节点才返回响应;
二是可用性也很差,主库和所有从库任何一个数据库出问题,都会影响业务。

读写分离

主库负责执行应用程序发来的所有数据更新请求,然后异步将数据变更实时同步到所有的从库中去,这样,主库和所有从库中的数据是完全一样的。多个从库共同分担应用的查询请求。

双主热备

负载均衡

  • 通过LVS三种模式( NAT, DR, TUN)实现负载均衡
  • MyCat数据库中间件实现负载均衡
【MYSQL】MySQL高并发环境解决方案深度解析 轻量级Java框架,在JDBC层提供额外服务:透明化的数据库代理端:云原生数据库代理MySQL高并发环境解决方案是一个系统性工程,需要综合考虑业务特点、技术架构、团队能力等多个因素。没有银弹式的解决方案,只有最适合当前业务场景的技术选型。业务优先:技术服务于业务,不为技术而技术渐进演进:避免激进的技术变革,保证系统稳定性监控驱动:建立完善的监控体系,用数据说话持续优化:根据业务发展持续优化架构随着技术的不断发展,新的解决方案和工具会不断涌现,但核心的设计思想和原则是相通的。 阅读详情

相关推荐

MySQL 常见的开放性问题

有一个超级大表,如何优化分页查询? 超级大表的分页优化分有以下两种方式: 数据库层面优化:利用子查询优化超多分页场景,比如:SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id ,先快速定位需要获取的 id 段,然后再关联查询。MySQL 并不是跳过 offset 行,而是取...

凯凯的博客 1441

mysql高并发环境解决方案有那些?

1、使用监控工具(如Prometheus、Grafana、Zabbix等)实时监控MySQL的性能指标,如QPS、TPS、响应时间、连接数等。3、分布式数据库架构:使用分布式数据库解决方案,如ShardingSphere、Vitess等,实现数据库的水平扩展和负载均衡。1、合理使用事务和锁机制,确保数据的完整性和一致性。1、使用缓存技术,如Redis、Memcached等,缓存热点数据和查询结果,减少对数据库的访问次数。1、使用高性能的服务器硬件,如更快的CPU、更大的内存和高速的存储设备。

DKPT的博客 1306

基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(三)SD卡驱动、FatFS等的移植和ini配置文件读取的实现

本文实现了基于STM32F107VC的金牛开发板的基于SPI模式的SD卡驱动和FatFS的移植,以及利用minini库对ini配置信息文件进行读取。

sqshining的专栏 2139

Mysql高并发解决方案

随着近些年来分布式的应用,其伴随而来的是系统的数据量也越来越大,为了可以提升系统的整体性能,我们对以Mysql为代表的关系型数据库也提出了“分布式”的要求.

蹊源的奇思妙想的博客 3825

glibc手动升级高版本导致系统(RedHat/Centos)异常(无法开机等)的解决方法(回退低版本glibc)

我的系统是Redhat7.6, 理论上Redhat7/Centos7都可以使用该方法解决问题。 首先慎重提醒各位:glibc升级会产生无法预料的后果!由于Android NDK需要高版本的glibc才可以使用,所以作死手动去更新了glibc2.18,使得重启系统后图形界面消失。(Redhat/Centos升级此类安装包最好用yum升级,因为系统内的程序对他们的依赖很大,升级会导致大部分程序无法使用...

weixin_42881528的博客 9698

YOLOv11+SAHI实战:5步搞定无人机航拍小目标检测(附VisDrone数据集调参技巧)

本文详细介绍了如何结合YOLOv11目标检测框架与SAHI切片推理技术,高效解决无人机航拍图像中的小目标检测难题。通过VisDrone数据集调参技巧和5步实战指南,帮助开发者快速构建高性能检测系统,显著提升小目标检测的准确率和效率。

rum55的博客 192

高并发写mysql

1)使用连接池连接池可以减少每次连接 MySQL 数据库的开销,提高连接复用率,从而提高系统的并发处理能力。常见的连接池有 C3P0、Druid 等。2)使用批量插入批量插入可以减少每次插入的开销,提高插入效率。可以通过 JDBC 的 addBatch() 和 executeBatch() 方法实现批量插入。3)使用事务事务可以保证多个操作的原子性,避免数据不一致的情况。可以通过 JDBC 的 setAutoCommit(false) 和 commit() 方法实现事务。4)使用分库分表。

weixin_45604164的博客 1523

【STM32开源实战】基于STM32的智能输液监控系统设计与实现

本文详细介绍了基于STM32F103C8T6主控芯片的智能输液监控系统设计与实现。该系统通过光学液位传感器、温度传感器和红外滴速检测模块实时监测输液状态,利用步进电机自动调节滴速,并通过蓝牙实现数据远程传输,为医院提供了一套低成本、高可靠性的智能输液解决方案。

h6i7j8的博客 762

高并发写入优化

数据库优化:选择合适的数据库类型和版本,使用合适的数据库引擎、缓存、索引等技术来提高数据库的写入性能。还可以考虑使用分库分表、异步写入等技术来降低单个数据库的写入压力。缓存优化:使用缓存来减轻数据库写入的压力,可以考虑使用内存数据库、分布式缓存等技术来提高缓存的读写性能。还可以使用缓存预热、缓存穿透等技术来提高缓存的效率。消息队列:使用消息队列来异步处理写入请求,可以将写入操作转化为消息发送,然后由消费者异步处理。异步处理:使用异步处理技术,如异步 IO、线程池等技术来提高系统的并发处理能力。

大道至简 1601

adb详细教程(四)-使用adb启动应用、关闭应用、清空应用数据、获取设备已安装应用列表

adb对于安卓移动端来说,是个非常重要的调试工具。通过ADB可以操作、管理设备上的应用。

公众号|软件测试老吴 3万+

LPDDR5 学习笔记01:功能概述

LPDDR5/LPDDR5X SDRAM设备采用8/16DQ通道架构,支持2Gb-32Gb容量。通过CK命令时钟和更快的WCK数据时钟协同工作,7个CA引脚传输控制信息,支持2:1或4:1的WCK:CK比例。设备提供BG/8B/16B三种存储模式选择,分别支持不同数据速率(最高8.533Gbps)和突发长度。采用0.5V VDDQ电源电压,实现高速双倍数据速率传输,并通过差分WCK时钟完成数据采样。读写采用突发访问机制,需先激活命令再执行读写操作。新型LPDDR5X仅支持BG和16B模式,优化了高速性能。

一只豌豆象的博客 2206

mysql锁等待超时Lock wait timeout exceeded; try restarting transaction分析和代码层面以及数据库层面解决方案

mysql锁等待超时Lock wait timeout exceeded; try restarting transaction分析和代码层面以及数据库层面解决方案 1.首先看下案发现场 org.springframework.dao.CannotAcquireLockException: Error updating database. Cause: java.sql.SQLException...

u012799495的博客 1569

全面解析量化价值投资多因子模型的原理

明明知道“买便宜的好公司”是价值投资的核心,但面对3000+只A股,如何快速筛选出“便宜又好”的标的?主观判断总被情绪干扰——明明PE很低的股票,买了却不涨;或者因为“感觉”错过牛股?想规模化投资,但手动分析100只股票就要花一周,根本无法覆盖全市场?量化价值投资的多因子模型,正是解决这些问题的钥匙。它将价值投资的核心逻辑(“便宜”“好公司”)转化为可量化的因子,用数学模型替代主观判断,实现系统化筛选、可回测验证、规模化复制的投资决策。为什么多因子模型能有效预测股票收益?

AI天才研究院 1059

Java面试(9)之数据库层性能优化

按照mysql官网,innodb建议不超过1017列,如果列数很大,考虑用mongodb,列数过大会导致分页。buffer pool、change buffer、log buffer与redo log交互。按照数据取模的问题在于,如果扩容了表,那么原来表里的数据就需要重新迁移会很麻烦.根据阿里开发手册: 单表行数超过500W或者单表数据容量超过2G。1, 一致性hash算法 0-(2的32 - 1)1.1 单表多大才考虑拆表?一, 表数据过大的解决方案。微信(朋友圈、我的相册)解决方案: 两阶段提交。

thinkers 658

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

清华学者讨论出来数据库减库存的几种方法

MySQL在电子商务网站使用越来越多,做为第一梯队做MySQL的从业人员,也经常被问到MySQL对于减库存在这块有什么好的处理方法?

程序员二黑 752

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

秒杀系统设计的5个要点

比如有10件商品要秒杀,可以放到缓存中,读写时不要加锁。 当并发量大的时候,可能有25个人秒杀成功,这样后面的就可以直接抛秒杀结束的静态页面。进去的25个人中有15个人是不可能获得商品的。所以可以根据进入的先后顺序只能前10个人购买成功。后面15个人就抛商品已秒杀完。

Tyson0314的博客 542

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

并发减库存,怎么保证不超卖?

Java技术栈www.javastack.cn关注阅读更多优质文章作者:废物大师兄来源:www.cnblogs.com/cjsblog/p/9135118.html秒杀的场景有很多,比如...

Java技术栈,分享最主流的Java技术 845

高并发大流量专题---10、MySQL数据库层的优化

高并发大流量专题---10、MySQL数据库层的优化 一、总结 一句话总结: mysql先考虑做分布式缓存,过了缓存后就做mysql数据库层面的优化 1、mysql数据库层的优化的前面一层是什么? 数据库缓存:突破了数据库缓存就需要做mysql数据库层的优化 2、mysql优化方向? 数据表数据类型优化;索引优化;SQL语句的优化 存储引擎的优化 数据表结构设计的优化...

weixin_34355715的博客 255

mysql高并发优化

一、Mysql高并发处理 例子1:新增手机号码,先判断是否已经存在,如果不存在则插入,在低并发访问情况下不会发生问题,在高并发下则会插入多条数据。 解决方案:通过写sql实现,在插入之前先判断是否已经存在数据。 INSERT INTO test SET(id,username,phone) SELECT '1','测试','10086' FROM DUALWHERE NOT EXIS...

南陈的博客 2879

《高并发系统的数据库层面优化实战:分库分表、读写分离与ShardingSphere》

本文深入探讨了高并发系统下数据库优化的核心技术,包括读写分离和分库分表的架构方案。首先分析了传统单机数据库的四大瓶颈:IO、CPU、连接数和存储容量。然后详细讲解了读写分离的原理与实现,重点解决数据延迟问题。接着介绍了分库分表的分片策略与挑战,如全局ID生成和跨库查询。文章还对比了HikariCP连接池和ShardingSphere等中间件的特点与配置。最后提出从基础优化到分库分表的渐进式架构演进建议,帮助开发者根据业务需求选择最适合的技术方案。

qq_34478339的博客 843

高并发库存扣减优化

背景 库存是电商中的一个核心概念,主要记录商品的可售等数量信息,其既简单又复杂,简单是因为它大多数时候就是提供一个商品是否可售的信息,下单扣库存,退款或则入库加库存就行了,因此从业务的角度上的确不算复杂。为什么复杂?因为在分布式高并发库存的性能上来说是需要考虑很多的,由此而展开的一系列的优化又会使简单的业务操作变的实现上异常复杂。本文介绍接触到一些库存上的优化,也会参照业界的最佳实践与设计模式探讨...

超威半导体 6055

高并发-解决方案

高并发-解决方案--目录总结1,什么是高并发2,常见的互联网分层架构3,分层水平扩展架构实践3-1,反向代理层的水平扩展3-2, 站点层的水平扩展3-3, 服务层的水平扩展3-4, 数据层的水平扩展按照范围水平拆分按照哈希水平拆分3-5,应用和静态资源分离3-6, 前端使用CDN引进资源3-7, 总结 提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。 垂直扩展可以通过提升单机硬件性能,或者提升单机架构性能,来提高并发性,但单机性能总是有极限的, 互

生活不止眼前的枸杞, 还有蜂蜜和咖啡! 1097

高并发解决方案

什么是高并发? 多个进程或线程同时(或着说在同一段时间内)访问同一资源会产生并发问题。 要想解决高并发,就要先了解高并发产生的位置. 高并发一般发生在两个位置,一:访问服务器时;二:访问数据库时; 1.1初期解决方案 1.1.1系统或服务器级别的解决方案 1)增大服务器的CPU。 2)增加内存条。 3)增加硬盘个数,对硬盘做Raid5。 4)换

擎苍仗剑去走秀、别叫我阿联 289

高并发场景下数据重复插入的问题以及DuplicateKeyException异常在高并发下或批量插入数据时如何优化

问题: 1.高并发时,数据库插入操作抛出DuplicateKeyException异常; 2.批量插入数据的时,数据库插入操作抛出DuplicateKeyException异常; 异常信息如下: org.springframework.dao.DuplicateKeyException: ....(具体信息省略......) 解决方案: ...

Mr_Runner的博客 6090
上一篇: 数据结构与算法(php)-二叉树
下一篇: 高并发解决方案-动态语言的并发处理
Lars6899
博客等级 码龄9年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值