您的位置:首页 > 数据库 > MySQL

Mysql优化总结

2018-02-26 14:30 225 查看
优化方式:( 建议性能优化顺序)1.sql及索引2.数据库表计较3.系统配置4.硬件
第一部分:sql优化
首先查找有问题的的sql?用慢查日志查询有问题的sql.查找步骤:使用MySQL慢日志对有效率问题的sql进行监控,就要看慢查日志监控是否开启.查询慢日志是否开启SHOW VARIABLES LIKE 'slow_query_log',一般为off,需要开启.查询所有日志状态:show VARIABLES LIKE 'log';开启慢查询日志记录 set global slow_query_log=on;记录没有使用索引的查询 set global log_queries_not_using_indexes=on记录慢查询日志的文件地址 set global slow_query_log_file="/var/lib/mysql/localhost-slow.log";查询时间超过0.5秒的sql语句会被记录set global long_query_time=0.5;慢查日志内容



慢查日志分析通过借助工具分析慢查日志,对结果进行分析,从而优化sql语句mysql自带慢查日志分析工具mysqldumpslow/或者pt-query-digest使用步骤不懂可借助:http://blog.sina.com.cn/s/blog_53b13d950100vmc5.htmlpt-query-digest:工具使用
查询有问题的sql1.查询次数多而且每次查询占用时间较长,通常为pt-query-digest:分析的前几个表2.io大的sql,注意pt-query-digest:分析中的rows和examine项3.没有命中索引的sql,注意:pt-query-digest:分析中rows examine和rows send的对比,(扫描行,发送行)数据库的瓶颈是io4.分析sql查询,使用explain查询sql的执行计划,explain返回各列的含义:table:显示这一行的数据是关于哪张表的,type:这是重要的列,显示链接使用了何种类型,从最好到最差的链接类型为const,eq_req,ref,range,index和all.possible_keys:显示可能用到其他表的索引,key:实际使用的索引;key_len;使用的索引长度,ref:显示索引的哪一列使用了rows:mysql认为必须检查用来返回请求链接的行数,注意:using file sort,using temporary 看到即需要优化5.优化max和count:建立索引,索引是顺序排列,优化max,count(*)和count (id)不一样,因为count* 包null.6.子查询优化,通常优化为join链接,注意是否产生重复数据(一对多时候),用distinct去重.7.优化group by (文件排序,临时表)可用子查询等改写.8.limit优化,先根据主键排序再分页,记录上次返回的主键,下次查询再使用主键过滤.
第二部分:索引优化:首先知道哪些列适合建建索引?where 从句,group by,order by,on 从句,出现的列  索引字段越小越好离散度大的列,放到联合索引的前面覆盖索引(covering index)指一个查询语句的执行只需要从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录。也可以称之为实现了索引覆盖。  那么,优点显而易见。辅助索引不包含一整行的记录,因此可以大大减少IO操作。覆盖索引是mysql dba常用的一种SQL优化手段两个或更多个列上的索引被称作复合索引。利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处5.查询列的离散程度:离散度更高的索引应该放在联合索引的前面,因为离散度高索引的可选择性高。考虑一种极端的情况,数据表中有100条记录,若INDEX(a,b)中a只有两种情况,而b有100种情况。这样对于查询唯一记录a = …,b = …时,先遍历全部索引看满足a条件的有50个索引节点,接下来还要再一个个遍历这50个索引节点。如果是INDEX(b,a),先遍历全部索引发现满足b条件的索引节点只有一个,再遍历这个节点发现也满足a条件。虽然最后都能找到那个唯一的索引节点,但是第二种索引顺序对引擎遍历索引效率有很大的提高(用电话薄的思想去思考问题)6.含有"IN"、"OR"的Where子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。7.索引优化:重复索引:表示一个列或者顺序相同的几个列上建立的多个索引。 冗余索引:两个索引所覆盖的列重叠
索引常用规则1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引;3、经常与其他表进行连接的表,在连接字段上应该建立索引;4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;5、索引应该建在选择性高的字段上;6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:8、频繁进行数据操作的表,不要建立太多的索引;9、删除无用的索引,避免对执行计划造成负面影响;A、正确选择复合索引中的主列字段,一般是选择性较好的字段;B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;第三部分:数据库结构优化1.选择合适数据类型(可以存下数据的最小数据类型)https://www.cnblogs.com/ghjbk/p/6681470.html2.尽量简单的数据类型3.尽量使用not null 4.少使用大数据类型一些例子:用int存储时间,利用from_unixtime(),unix_timeStamp()两个函数,进行存查用bigint存储ip地址5.表的规范化与反规范化第三设计范式,概念.存在问题:删除异常,捕入异常,更新异常,数据冗余反范式概念空间换取时间6.表的垂直拆分:一个表分出几个表7.表的水平拆分:表结构一样,水平切分注意:跨区分表进行数据查询,统计及后台报表操作前台和后台分开.第四部分:系统配置优化系统参数配置tcp支持的队列数tcp_max_syn_backlog=65535
表示SYN队列的长度,默认为1024,加大队列长度为8000,可以容纳更多等待连接的网络连接数net.ipv4.tcp_max_tw_bucktes=8000
net.ipv4.tcp_tw_reuse=1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭net.ipv4.tcp_tw_recycle=1
修改系統默认的 TIMEOUT 时间net.ipv4.tcp_fin_timeout=10mysql每次查询相当于打开一个文件设置文件打开数限制,可以优化数据库性能修改limits.conf 文件 /etc/security/limits.conftype:有 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比har 限制高。用 - 就表明同时设置了 soft 和 hard 的值。    soft    nofile  65535   hard    nofile 65535除此之外,最好关闭mysql服务器上iptables,seinux等防火墙
mysql配置文件:1.首先找到配置文件位置2.mysq配置文件--常用参数:(1).innodb_buffer_pro_size>=total MB,配置innodb缓冲池,如果数据只有innodb,则配置内存75%sql语句算出总额大小(数据)(2).innodb_buffer_pool_instanes(mysql5.5),控制缓冲池个数,一般四份,总数除份数(3).innodb_log_buffer_size.日志(4).innodb_flash_log_at_trx_commit.关键参数,对innodb的io影响较大,一般默认值为1,可以配置为2,如果对安全要求高,可以配置为1不改.(5).innodb_read_io_threads读,innodb_write_io_threads写,读写的线程数,默认为4,根据cpu的读写配置.(6).innodb_file_per_table关键参数,默认为off.即所有表都会建立在共享表空间中,日志无法收缩,影响读写,建议为on,独立表空间增加读写效率.(7).innodb_stats_on_mefadata.决定了什么时候刷新,innodb表的统计信息,设为off,自己刷新第三方配置向导工具productivity tools for MySQL
第五部分  服务器硬件优化内存优化配置较大的内存,足够大的内存,是提高mysql数据库性能的方法之一,内存的io比磁盘快得多,可以增加系统的缓冲区容量,使数据内存停留的时间更长,以较少磁盘的iocpu选择如何选择cpu 单核更快的cpu  还是多核cpu,mysql一些工作只能用到一个cpu ,不能并发用到多个cpu,基于这些特点考虑用单核更快的cpu.cpu配置:在服务器的BIOS设置中,可调整下面的几个配置:选择Performance Per Watt Optimeized(DAPC)模式,发挥cpu最大性能:关闭和C States等选项,提升cpu效率;Memory frequency (内存频率),选择 Maximum performance磁盘RAID最初全称为『 Redundant Arrays of Inexpensive Disks 』“容错式廉价磁盘阵列”,后来改为『 Redundant Arrays of Independent Disks 』“容错式独立磁盘阵列”,它被用来提高整个磁盘系统IO能力、冗余能力和可用空间。磁盘阵列是由数个磁盘,组合成一个较大的磁盘组,根据选择的RAID等级不同,提供不同的功能.说白了就是多块硬盘,处理数据的磁盘多了,处理能力变快了通常简称为磁盘阵列。简单地说, RAID 是由多个独立的高性能磁盘驱动器组成的磁盘子系统,从而提供比单个磁盘更高的存储性能和数据冗余的技术。 RAID 是一类多磁盘管理技术,其向主机环境提供了成本适中、数据可靠性高的高性能存储.名词介绍详细:http://www.hack520.com/169.htmlraid0:又叫条带.IO级别最好,数据安全不好raid1:镜像,至少两个磁盘,安全性较高raid5:最少三个磁盘raid1+0:同时结合1+0;一般建议使用使用机械硬盘的话,建议使用高转速
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: