1、影响数据库查询速度的因素1.1影响数据库查询速度的四大因素1.2风险分析QPS:QueriesPerSecond的意思是“每秒的查询率”,是一个服务器每秒可以执行的对应查询数。衡量特定查询服务器在指定时间段内处理多少流量的指标。TPS:是TransactionsPerSecond的缩写,即每秒的事务数。它是软件测试结果的度量单位。客户端在发送请求时开始计时,收到服务器的响应后结束计时,从而计算所用时间和完成的事务数。Tips:***不要备份主库上的数据库,大型活动前取消这样的计划。低效的sql:超高的QPS和TPS。并发量大:数据连接数被占满(max_connection默认100,连接数一般设置大一些)。并发数:数据库服务器同时处理的请求数。CPU占用率超高:CPU资源耗尽,宕机。磁盘IO:磁盘IO性能突然下降,以及大量消耗磁盘性能的定时任务。解决方法:加快磁盘设备,调整计划任务,做好磁盘维护工作。1.3网卡流量:如何避免无法连接数据库的情况减少从服务器数量(从服务器会从主服务器复制日志)进行分层缓存(避免前端缓存大量失效)避免使用select*forquery业务网络和服务器网络分离1.4大表带来的问题(重要)1.4.1大表的特点记录数巨大,单表数据文件超过几十个百万表很大,超过10个G1.4.2大表的危害1.查询慢:短时间内查询困难数据量大的表中的数据会产生大量的磁盘io->降低磁盘效率2.对DDL的影响:建立索引需要很长时间:MySQL-v<5.5创建索引会锁定表MySQL-v>=5.5索引建立会造成主从延时(mysql索引创建,先在组上执行,再在库上执行)修改表结构需要长时间锁表:会造成主从延时长('480秒延时')1.4.3数据库上大表如何处理分库分表将一个大表分成多个小表难点:选择子表的主键,分表后交叉分区数据查询和statistics1.5大事务带来的问题(重要*)*1.5.1什么是事务1.5.2事务的ACID属性1.原子性:全部成功,全部回滚失败。银行存款和取款。2.一致:银行转账总额不变。3.隔离:隔离级别:未提交读(READUNCOMMITED)脏读,两个事务相互可见;提交读(READCOMMITED)符合隔离的基本概念,当一个事务在进行时,其他Committed的东西对这个事务是可见的,即可以获取到其他事务提交的数据。可重复读(REPEATABLEREAD)InnoDB的默认隔离级别。当这个事务在进行时,其他所有的事务对它来说都是不可见的,也就是读了多次,结果是一样的!序列化(SERIALIZABLE)对读取的每一行数据都加锁,会造成大量的锁超时和锁请求。数据严格一致性,无并发。查看系统的事务隔离级别:showvariableslike'%iso%';开始一个新的交易:开始;提交交易:commit;修改事物的隔离级别:setsessiontx_isolation='read-committed';4.持久化(DURABILITY):从数据库的角度持久化,磁盘损坏不会起作用。redolog机制保证了事务更新的一致性和持久性。滚动时间长,执行时间长。过多的数据被锁定,导致大量阻塞和锁定超时;回滚需要很长时间,数据仍然会被锁定;如果执行时间长,会造成主从延迟,因为只有当主服务器写完日志后,从服务器才会开始同步,造成延迟。解决方案:为避免一次处理过多的数据,可以分批处理;删除不必要的SELECT操作,并确保事务中只包含必要的写操作。二、什么影响MySQL性能(很重要)2.1影响性能的几个方面服务器硬件。服务器系统(系统参数优化)。存储引擎。MyISAM:不支持事务,表级锁。InnoDB:支持事务,支持行级锁,支持事务ACID。数据库参数配置。数据库结构设计和SQL语句。(重点优化)2.2MySQL架构分为三层:客户端->服务层->存储引擎MySQL是一个插件式的存储引擎,存储引擎有很多种。只要实现符合mysql存储引擎的接口,就可以开发自己的存储引擎!所有跨存储引擎的功能都在服务层实现。MySQL的存储引擎是针对表的,而不是针对库的。也就是说,一个数据库可以使用不同的存储引擎。但不推荐这样做。2.3InnoDB存储引擎MySQL5.5及以后版本默认的存储引擎:InnoDB。2.3.1InnoDB使用表空间进行数据存储。showvariableslike'innodb_file_per_table如果innodbfileper_table为ON,会建立一个独立的表空间,文件为tablename.ibd;如果innodbfileper_table为OFF,数据将存储在系统的共享表空间中,文件为ibdataX(X为从1开始的整数);。frm:是服务器级别生成的文件,类似于服务器级别的数据字典,记录了表结构。2.3.2(MySQL5.5默认)系统表空间和(MySQL5.6及以后默认)独立表空间1.1系统表空间不能简单的缩小文件大小,造成空间浪费和大量磁盘碎片。1.2独立表空间可以通过optimezetable缩减系统文件,不需要重启服务器,不会影响正常访问表。2.1如果刷新多张表,其实是顺序执行的,会造成IO瓶颈。2.2独立表空间可以同时刷新数据到多个文件。强势确立Innodb使用单独的表空间,优化更方便可控。2.3.3将系统表空间中的表转移到独立表空间的方法1、使用mysqldump导出所有数据库数据(存储过程、触发器、定时任务必须一起导出),可以在从服务器上操作。2、停止MYsql服务器,修改参数(innodbfileper_table增加my.cnf),删除Inoodb相关文件(Data目录可重建)。3、重启MYSQL,重建Innodb系统表空间。4.重新导入数据。或者Altertable也可以转移,但是系统表空间占用的空间无法回收。2.4InnoDB存储引擎的特点2.4.1特点1:事务型存储引擎和两种特殊的日志类型:RedoLog和UndoLogInnodb是一个事务型存储引擎。完全支持事务的ACID属性。支持事务需要两种特殊的日志类型:RedoLog和UndoLogRedoLog:实现事务持久化(已提交的事务)。UndoLog:未提交的事务,独立于表空间,需要随机访问,可以存储在高性能io设备上。Undolog记录某条数据修改前的值,可用于事务失败时回滚;Redolog记录的是某个数据块被修改后的值,可以用来恢复成功事务更新后尚未写入数据文件的数据。2.4.2特性二:支持行级锁InnoDB支持行级锁。行级锁可以最大程度的支持并发。行级锁由存储引擎层实现。2.5什么是锁2.5.1锁2.5.2锁类型2.5.3锁粒度MySQL对事务的支持与MySQL服务器本身无关,而是与存储引擎有关对table_name加表级锁命令:locktabletable_namewrite;write锁会阻塞其他用户对该表的读写操作,直到释放写锁:unlocktables;锁的开销越大,粒度越小,并发度越高。表级锁通常在服务器层实现。行级锁在存储引擎层实现。InnoDB的锁机制是服务器层不知道的。2.5.4阻塞与死锁(1)阻塞是资源不足造成的队列等待现象。(2)死锁是由于两个对象在拥有一个资源的同时申请另一个资源,而另一个资源恰好被这两个对象持有,导致两个对象无法完成操作,而持有的资源无法发布。2.6如何选择正确的存储引擎参考条件:事务备份(Innobd免费在线备份)崩溃恢复存储引擎独有特性总结:Innodb好。注意:尽量不要混合使用存储引擎,如回滚会导致在线热备份出现问题。2.7配置参数2.7.1内存配置相关参数决定了可用内存的上限。内存使用上限不能超过物理内存,否则容易造成内存溢出;(对于32位操作系统,MySQL只能尝试3G以下的内存。)单独确定MySQL每个连接使用的内存。sort_buffer_size#定义每个线程的排序缓冲区的大小。当有查询需要排序操作时,MySQL会为每个buffer分配内存(直接为这个参数分配所有内存);join_buffer_size#定义每个线程使用的连接缓冲区的大小,如果一个查询关联了多个表,MySQL会为每个表分配一个连接缓冲区,导致一个查询有多个连接缓冲区;read_buffer_size#定义当对一个MyISAM进行全表扫描时分配的读取缓冲池的大小。MySQL会在需要查询时为其分配内存,必须是4k的倍数;read_rnd_buffer_size#索引缓冲区的大小。MySQL会在需要查询的时候为其分配内存,只分配需要的大小。注:以上四个参数是为一个线程分配的,如果有100个连接,则需要×100。MySQL数据库实例:①MySQL是单进程多线程的(而oracle是多进程的),也就是说MySQL实例是系统上的一个服务进程,即一个进程;②MySQL实例由线程和内存组成,实例实际用于操作数据库文件;通常,一个实例操作一个或多个数据库;在集群中,多个实例操作一个或多个数据库。bufferpool如何分配内存:Innodb_buffer_pool_size,它定义了Innodb使用的bufferpool的大小,对其性能很重要,必须足够大,但如果太大,刷新dirty会耗费更多时间当Innodb关闭时,页面从缓冲池到磁盘;totalmemory-(每个线程需要的内存*连接数)-系统预留内存系统预留更多内存空间;selectsum(index_length)frominformation_schema.talbeswheree``engine=``'myisam'注意:即使开发使用的表都是Innodb表,也必须为MyISAM预留内存,因为MySQL系统使用的表仍然是MyISAM表。max_connections控制允许的最大连接数,一般2000较大。不要使用外键约束来确保数据完整性。2.8性能优化顺序从上到下:
