首页 > 数据库 >MySQL-数据库优化

MySQL-数据库优化

时间:2022-11-10 18:11:32浏览次数:41  
标签:缓存 数据库 MySQL 查询 索引 SQL 优化

  数据库优化:   数据库设计:   1.字段选型:     数字类型: tinyint smalint mediumint int bigint     字符类型: char varchar     事件类型: date datetime timestamp   首先秉承的原则:     1.小就是美     2.简单就是美     3.先规范,必要时灵活     2. 表设计优化     时间字段防止时间类型datetime,选择int,为了查询和索引空间及程序层灵活处理     表字段的长度例如名字,个人描述等不需要很多字符的数据,尽量可能用固定类型 char 或者     varchar(n) ,但是n必须严格控制,而不再是之前随意的100 200 255等,这样严重浪费空间及接口数     据传输时的消耗     避免使用text, 比如使用,独立存放     不建议在数据库中保存图片,文档,视频对象,数据库是用来存储结构化数据,尽量保证它的简单     主键字段用于多表关联时,用于自增数据类型,不建议用字符类型做主键     最好不要用外键,比如一些可能涉及外键的更新, 查询 ,可以让程序层去处理       数据库性能优化:     1.存储引擎优化     MyISAM:MyISAM引擎查询性能优越,因为它的所有数据及索引都在一个节点上,好处是无需数据一致性, 高并发 堆表, 存储和查询是随机的 查询慢,写入快 因为无序,但是随便写入, MyISAM容易被损坏,MyISAM底层就是IO磁盘写入,所以容易崩盘     InnoDB: InnoDB 是专注高并发业务的存储引擎,拥有事物来保证数据的一致性和行锁机制 索引组织表 查询快 写入慢 因为有序,但是写入需要先找顺序 InnoDB相比较不容易被损坏,因为InnoDB有缓存区     TokuDB:海量数据,采集数据,高压缩数据,早期日志存储引擎选用,但是用户量及访问量增长,出现db写入卡顿,主从 waiting for ack等       但是拥有优秀的写入性能及数据压缩性能     Infobright:由于统计系统需要频繁汇总和分析多大至少 5 张业务大表,鉴于此特意调研了它,感觉有点跟数据仓库差不多,不过由于当时的数据库没有自带这个存储引擎就换 es 了     2.索引优化     由于 MySQL 索引是一棵平衡 b + 树,然而 b + 树最好的就是查找最小或最大很快,并且随着数据量的增长,树的高度不会很大,因此基于主键查找一条数据时也就是树高度 + 1 次 IO 扫描。     如果查询字段涉及到回表,可能就需要一次回表 IO,根据 MySQL 官方单次 IO 预计是 10ms,也就是说基于主键查询会超级快。     MySQL 更新操作尽量基于主键更新     谨慎合理添加索引,不是越多越好。需要平衡 select 和 dml,考虑索引的效率   数据排除 predicate 及数据过滤 fiter。     不在列上做运算,让程序去做运算,数据比较时类型一致。     索引列一般尽量不更新,频繁更新的列见索引,得慎重。     合理建立联合索引,避免冗余索引       第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。   第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。   第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。     索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,例如:   在经常需要搜索的列上,可以加快搜索的速度;   在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;   在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度;   在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;   在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;   在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。     缓存原理: 硬盘到内存(拷贝)     利用高效的内存机制. 把经常查询的磁盘资源按照某种规则放入内存通常是类似于KV结构,按照一定规则进行刷新和缓存.     索引原理: 硬盘+数据结构+内存(建立关联索引)     利用内存来存储数据的位置关联信息, 硬盘通过数据结构化存储配合索引快速定位到数据位置, 再通过io读取     与缓存的区别:缓存是全量内存备份, 索引是关键信息内存备份,其他信息进行硬盘读写         3.SQL优化     SQL尽量保持简单,MySQL优化器不足,处理负责SQL时容易选错执行计划     MySQL没有SQL级并行, hashjoin, 分析函数等特性, 处理复杂SQL能力不强     复杂SQL拆分成简单SQL     SQL where 条件中的变量都要使用绑定变量     绑定变量可以提升系统性能,并且提高安全性     查询避免扫描所有数据,例如 not in等,尽量缩小范围     减少数据库运算量,降低数据库压力     不用select * , 只查询需要的字段, 减少 cpu, 内存, 网络等消耗,减少由于表变更对应应用的影响; 使用覆盖索引提升性能     MySQL条件语句执行顺序是从左到右,所以,查询范围越 "大" 的可以先执行,让其后查询范围变小 ( oracle数据库是从右到左 )       4.数据 SQL 的cache     关闭query cache (不然会影响tps 2) redis缓存,减少数据库 ops,降低数据库压力       关于SQL总结:     SQL一定要避免全表扫描     SQL需要的资源是 cpu+men+io+net+lock     优化SQL本质上利用合理算法,平衡这些资源,更好的执行SQL,满足应用需求,解决吞吐量和响应时间     好的SQL是数据量增加或者并发增加, SQL运行时间不变, 后者影响不大     好的SQL基本来自于: 好的软降框架, 好的存储架构, 良好的SQL书写     SQL优化最重要的思想就是 减少IO     数据库性能监控及容灾:   1.MySQL常用性能监控信息     2.MySQL横向扩展     数据量扩大,单台数据库服务器性能已无法满足业务需求,该考虑增加服务器扩展架构,主要思想是分解单台数据库负载,突破磁盘I/O性能,热数据存放缓存中,降低磁盘I/O访问频率,但是要注意过程中的数据的安全性, 高可用性     3.增加缓存     数据库增加缓存系统,把热数据缓存到内存,如果缓存中有请求的数据就不再去请求MySQL,为了减少数据库负载,缓存实现包括本地缓存和分布式缓存.     本地缓存是将数据缓存到本地服务器内存中或文件中,分布式缓存可以缓存海量数据     扩展性好, 主流的分布式缓存系统包括: Memcached, Redis     Memcached性能稳定,数据缓存在内存中,速度很快,QPS理论可达8w左右     如果想数据持久化就选择用Redis, 性能不低于Memcached     工作过程: 请求数据 ==> redis 是否存在 ==>无( 去MySQL 数据库 )     4.主从复制与读写分离     系统一般来说读多写少,可部署一主多从架构, 主数据库负责写操作,并做双机热备,多台从数据库做负载均衡,负责读操作     读写分离:读写分离多数在代码层面实现读写分离,效率高. 另外一种方式通过代理程序实现读写分离, 企业中应用较少,会增加中间件消耗. 中间件代理有:MyCat,Atlas等     5.分库     分库是根据业务将数据库中相关的表分离到不同的数据库中. 例如业务量很大,还可以将分离后的数据库做主从复制架构,进一步避免单库压力过大     数据库维护:   1.开启慢查询日志     MySQL开启慢查询日志,分析出那条SQL语句比较慢,支持动态开启     在my.cnf文件中,可以指定慢查询多长时间,系统认定为慢SQL,标记,然后处理   2.数据库备份     使用XtraBackup凌晨定时备份数据        

标签:缓存,数据库,MySQL,查询,索引,SQL,优化
From: https://www.cnblogs.com/qiezi777/p/16877945.html

相关文章

  • MySQL-InnoDB的MVCC
     InnoDBMVCCInnoDB的MVCC,其实是通过undolog来实现的,可以理解为是通过在每行记录后面保存两个隐藏的列来实现的,分别保存了这个行的创建时间,一个保......
  • MySQL-索引类型优缺点
     MySQL主要集中索引类型:FULLTEXT,HASH,BTREE,RTREE 1.FULLTEXT即为全文索引,目前只有MyISAM支持。不过目前只有CHAR,VARCHAR,TEXT列上可以创建全文索引。......
  • MySQL聚簇索引和非聚簇索引
     聚簇索引和非聚簇索引 在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表......
  • mysql多个结果集拼接一行
    五个不同的结果,查询出来,拼接成一行 SELECT*FROM ( SELECT plant_nameasplantName FROMpv_power_plant <iftest="plantId!=nullandplantId!=''"......
  • MySQL的InnerDB和MySAM索引实现
     InnoDB索引实现 InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。InnoDB的主索引:MyISAM索引文件和数据文件是分离的,索引文件仅保......
  • Centos mysql主从复制配置
    1、需要准备两台mysql服务器。我这里主机mt1 从机mt2查看两个服务器的防火墙是否关闭;如果没有关闭需要关闭。查看防火墙状态命令。statusfirewalld;如果是通过虚拟机克隆......
  • XtraBackup数据库备份工具
    XtraBackupPerconaXtraBackup是一款基于MySQL的服务器的开源热备份实用程序,在备份过程中不会锁定数据库。它可以备份来自MySQL5.1,5.5,5.6和5.7服务器上的InnoDB,XtraDB和MyI......
  • 关于使用pt-heartbeat监测MySQL主从复制延迟的方法
    pt-heartbeat的工作原理通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新特定表里的时间戳,再与本地系统时间对比来得出其延迟。具体流程:1)在主库上创建一张heart......
  • 数据库保存经纬度采用什么数据类型好?
    如下表所示赤道周长(米)度数(度)40076000360111322.2222111132.222220.11113.2222220.01111.32222220.00111.132222220.00011.113222222......
  • .NET性能优化-是时候换个序列化协议了
    计算机单机性能一直受到摩尔定律的约束,随着移动互联网的兴趣,单机性能不足的瓶颈越来越明显,制约着整个行业的发展。不过我们虽然不能无止境的纵向扩容系统,但是我们可以分布......