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.5indexing会锁表MySQL-v>=5.5indexing会造成主从延迟(mysql中dexing,先在组上执行,再在数据库上执行)修改表结构需要长时间锁表:会造成主从延迟很长('480秒延迟')1.4.3如何处理数据库上有大表分库分表将一个大表分成多个小表难点:选择子表的主键,分表后交叉分区数据查询与统计1.5大事务带来的问题(important*)*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操作以确保事务中只包含必要的写操作。2.什么影响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服务器,修改参数(my.cnf加入innodbfileper_table),删除Inoodb相关文件(可以重建Data目录)。3、重启MYSQL,重建Innodb系统表空间。4.重新导入数据。或者Altertable也可以转移,但是系统表空间占用的空间无法回收。2.4InnoDB存储引擎的特点2.4.1特点1:事务型存储引擎和两种特殊的日志类型:RedoLog和UndoLogInnodb是一个事务型存储引擎。完全支持事务的ACID属性。支持事务需要两种特殊的日志类型:RedoLog和UndoLogRedoLog:实现事务持久化(已提交的事务)。UndoLog:未提交的事务,独立于表空间,需要随机访问,可以存储在高性能io设备上。Undolog记录了一个数据块被修改前的值,可用于事务失败时回滚;重做日志记录了一个数据块被修改后的值,可以用来恢复成功事务更新后尚未写入数据文件的数据。2.4.2特性二:支持行级锁InnoDB支持行级锁。行级锁可以最大程度的支持并发。行级锁由存储引擎层实现。2.5什么是锁2.5.1锁2.5.2锁类型2.5.3锁粒度MySQL对事务的支持与MySQL服务器本身无关,而是与存储引擎有关对table_name加表级锁命令:locktabletable_namewrite;write锁会阻塞其他用户对该表的读写操作,直到释放写锁:unlocktables;锁的开销越大,粒度越小,并发度越高。表级锁通常在服务器层实现。行级锁在存储引擎层实现。Innodb的锁机制是server层不知道的。2.5.4阻塞和死锁(1)阻塞是资源不足造成的排队等待现象。(2)死锁是由于两个对象在拥有一个资源的同时申请另一个资源,而另一个资源恰好被这两个对象持有,导致两个对象无法完成操作,而持有的资源无法发布。2.6如何选择正确的存储引擎参考条件:事务备份(Innobd免费在线备份)崩溃恢复存储引擎独有特性总结:Innodb好。注意:尽量不要混合使用存储引擎,如回滚会导致在线热备份出现问题。2.7配置参数2.7.1内存配置相关参数决定了可用内存的上限。内存使用上限不能超过物理内存,否则容易造成内存溢出;(对于32位操作系统,MySQL只能尝试3G以下的内存。)确定MySQL每个连接使用的内存。sort_buffer_size#定义每个线程排序缓冲区的大小,MySQL会在有查询需要做排序操作时为每个缓冲区分配内存(直接分配该参数的所有内存)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-(每个线程需要的内存*连接数)-系统预留内存key_buffer_size,它定义了MyISAM使用的缓冲池的大小。由于数据是由存储操作系统缓存的,因此必须为运行系统预留更多的内存空间;selectsum(index_length)frominformation_schema.talbeswhereengine='myisam'注意:即使开发使用的表都是Innodb表,也必须为MyISAM预留内存,因为MySQL系统使用的表仍然是MyISAM表。max_connections控制允许的最大连接数,一般2000较大。不要使用外键约束来确保数据完整性。2.8性能优化顺序从上到下:
