sql优化

MySQL数据库优化

梦想的初衷 提交于 2020-01-13 13:46:59
数据库优化的目的 1.避免出现页面访问错误 由于数据库连接 timeout 产生页面5xx错误 由于慢查询造成页面无法加载 由于阻塞造成数据无法提交 2.增加数据库的稳定性 很多数据库问题都是由低效的查询引起的 3.优化用户体验 流畅的页面访问速度 良好的网站功能体验 MySQL数据库优化 上图是数据库优化的金字塔结构。可以看出,SQL及索引优化位于金字塔的最低层,是数据库优化的基础,成本最低,效果却最好。 一 SQL语句优化 找出有问题的SQL 1.1 使用MySQL慢查询日志对低效率的SQL进行监控 1)查询是否开启了慢查询日志 show variables like 'slow_query_log'; 2)设置记录未使用索引的查询 set global log_queries_not_using_indexes=on; 3)设置慢查询时间 set global long_query_time=0.1; 注:直接修改 global 的 long_query_time 在当前窗口是不生效的,在新打开的窗口才有效果。如果想让当前窗口生效,在设置时不用加 global 关键字。 4)设置慢查询日志地址 set global slow_query_log_file='/home/log/mysql/mysql-query.log'; 5)开启慢查询日志 set global slow

mysql-主从复制原理浅析

蓝咒 提交于 2020-01-13 12:59:43
一.MySQL主从原理  1.众所周知,MySQL是一个开放源码的小型关联式数据库管理系统,由于其体积小、速度快、成本低。源码开放等这些优点   被许多中小型网站使用。但随着访问量的不断增加,Mysql数据库压力不断增加,需要对mysql进行优化和架构改造,可以使用   高可用、主从复制、读写分离来拆分库表进行优化,接下来简单理解一下mysql的主从复制原理:        MySQL数据库主从复制原理:   Mysql主从同步其实是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,整个过程需要开启三个线程:   分别是master的IO线程,slave开启IO线程和SQL线程。   1).在从服务器上执行slave start,从服务器上的IO线程会通过授权用户连接上master,并请求master从指定的文件和位置之后发送bin-log日志内容。   2).master服务器收到来自slave服务器的IO线程的请求后,master服务器上的IO线程根据slave服务器发送的指定的bin-log日志之后的内容,然后返回给slave端的IO线程。    (返回的信息中除了bin-log日志内容外,还有本次返回日志内容后在master服务端的新的binlog文件名以及在binlog中的下一个指定更新位置)   3).slave的Io线程接收到信息后

MySQL数据库优化总结

一曲冷凌霜 提交于 2020-01-13 12:53:02
对于一个以数据为中心的应用,数据库的好坏直接影响到程序的性能,因此数据库性能至关重要。一般来说,要保证数据库的效率,要做好以下四个方面的工作:数据库设计、sql语句优化、数据库参数配置、恰当的硬件资源和操作系统,这个顺序也表现了这四个工作对性能影响的大小。下面我们逐个阐明: 一、数据库设计   适度的反范式,注意是适度的   我们都知道三范式,基于三范式建立的模型是最有效保存数 据的方式,也是最容易扩展的模式。我们在开发应用程序时,设计的数据库要最大程度的遵守三范式,特别是对于OLTP型的系统,三范式是必须遵守的规则。当 然,三范式最大的问题在于查询时通常需要join很多表,导致查询效率很低。所以有时候基于性能考虑,我们需要有意的违反三范式,适度的做冗余,以达到提 高查询效率的目的。注意这里的反范式是适度的,必须为这种做法提供充分的理由。下面就是一个糟糕的实例:      在这里,为了提高学生活动记录的检索效率,把单位名称冗余到学生活动记录表里。单位信息有500条记录,而学生活动记录在一年内大概有200万数据量。 如果学生活动记录表不冗余这个单位名称字段,只包含三个int字段和一个timestamp字段,只占用了16字节,是一个很小的表。而冗余了一个 varchar(32)的字段后则是原来的3倍,检索起来相应也多了这么多的I/O。而且记录数相差悬殊,500 VS 2000000

Mysql索引优化分析-第一篇

巧了我就是萌 提交于 2020-01-13 10:20:25
1.性能下降SQL慢 执行时间长 等待时间长 查询语句写的烂 索引失效(单值,复合) 关联查询太多join(设计缺陷或不得已的需求) 服务器调优及各个参数设置(缓冲\线程数等) 2.常见通用的join查询 2.1SQL执行顺序 2.1.1手写 2.1.2机读 2.1.3总结 2.2Join图 2.3建表SQL 2.4 7种Join 3.索引简介 3.1什么是索引 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 可以得到索引的本质: 索引是数据结构 可以简单理解为"排好序的快速查找数据结构"。 详解(重要): 结论: 数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以文件形式存储在硬盘上. 我们平时所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉树)结构组织的索引。 其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈希索引(hash index)等。 3.2索引优势 类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本 通过索引列对数据进行排序

MySQL之SQL语句的优化

邮差的信 提交于 2020-01-13 05:20:22
仅供自己学习 结论写在前面: 1、尽量避免进行全表扫描,可以给where和order by涉及的列上建立索引 2、尽量避免在where子句中使用 !=或<>操作符,因为这样会导致引擎放弃索引而进行全表扫描 3、尽量避免在where子句中对字段进行null的判断(如:select id from t where age is null ) 4、尽量避免在where子句中使用or来连接条件,否则将会 导致引擎放弃索引而进行全表扫描(如:select id from t where num=10 or num=20 ,可以union all:select id from t where num=10 union all select id from t where num=20 ) 5、尽量避免在like查询中使用2个%来查询,否则 进行全表扫描 (如:select id from t where name like '%abc%' ) 6、尽量避免在where子句中使用in和not in来查询,否则进行全表扫描(如:select id from t where num in(1,2,3) ,可以使用between:select id from t where num between 1 and 3 ) 7、尽量避免在 where 子句中对字段进行表达式操作, 否则 进行全表扫描(如:

mysql数据库优化之语句优化

余生长醉 提交于 2020-01-13 05:19:29
数据库优化目的 避免出现页面访问错误 1、由于数据库链接timeout产生页面5xxx错我 2、由于慢查询造成页面无法加载 3、由于阻塞造成数据无法提交 如何发现有问题的sql 使用mysql慢查日志对有效率问题的sql进行监控 show variables like '%slow%'; set global log_queries_not_using_indexes=on; 代表 记录下没有使用索引的sql 后面进行优化 ,记录未使用索引的 打开 long_query_time 单位是秒 一般设置成100ms,也就是0.1秒 如果慢查日志时间短,会有大量的日志,磁盘空间可能会被沾满 第一款MySQL官方的mysqldumpslow 分析慢查工具 安装好mysql后自带的工具,mysqldumpslow -t 3 慢查日志路径 | more 查看 但是结果信息不是很全面 所以用pt-query-digest --limit=A 参数 -review expain 执行计划 如扫描行数很多,发送到客户端的很少,代表了索引不是很好 第一部分是头显示了基本信息,时间范围 sql数量 第二部表统计信息 第三部分 sql信息 举例说明 就是,这个sql 执行了一次,但是执行时间占用了百分之73百分比,这种sql重点关注,就是执行次数多,占用总时间的百分比大。数据库主要瓶颈在io这

mysql主从配置

萝らか妹 提交于 2020-01-13 04:40:31
随着访问量的不断增加,Mysql 数据库压力不断增加,需要对 mysql 进行优化和架构改 造,可以使用高可用、主从复制、读写分离来、拆分库、拆分表进行优化。下面我们来学习 MySQL 主从复制高可用如何来实现。 MySQL 数据库主从复制原理 Mysql 主从同步其实是一个异步复制的过程,要实现复制首先需要在 master 上开启 bin-log 日志功能,整个过程需要开启 3 个线程,分别是 Master 开启 IO 线程,slave 开启 IO 线程和 SQL 线程。 a) 在从服务器执行 slave start,从服务器上 IO 线程会通过授权的用户连接上 master, 并请求 master 从指定的文件和位置之后发送 bin-log 日志内容。 b) Master 服务器接收到来自 slave 服务器的 IO 线程的请求后,master 服务器上的 IO 线 程根据 slave 服务器发送的指定 bin-log 日志之后的内容,然后返回给 slave 端的 IO 线程。(返回的信息中除了 bin-log 日志内容外,还有本次返回日志内容后在 master 服务器端的新的 binlog 文件名以及在 binlog 中的下一个指定更新位置。) c) Slave 的 IO 线程接收到信息后,将接收到的日志内容依次添加到 Slave 端的 relay-log 文件的最末端

MySQL 索引详解

点点圈 提交于 2020-01-13 04:24:58
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 注: [1] 索引不是万能的 ! 索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程序上弥补这一缺陷,许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE选项的作用将非常明显。 [2]另外, 索引还会在硬盘上占用相当大的空间 。 因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。 从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL把同一个数据表里的索引总数限制为16个。 1. InnoDB数据表的索引 与MyISAM数据表相比,索引对InnoDB数据的重要性要大得多。在InnoDB数据表上,索引对InnoDB数据表的重要性要在得多。在 InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。”数据行级锁定”的意思是指在事务操作的执行过程中锁定正在被处理的个别记录

mysql执行计划 const eq_ref ref range index all

白昼怎懂夜的黑 提交于 2020-01-13 03:59:46
explain:查询查询性能或者需要查看使用索引状态 一、type:连接类型 最关键的一列 效率(const>eq_ref>ref>range>index>all) 1、const:查询索引字段,并且表中最多只有一行匹配(好像只有主键查询只匹配一行才会是const,有些情况唯一索引匹配一行会是ref) 2、eq_ref 主键或者唯一索引 3、ref 非唯一索引(主键也是唯一索引) 4、range 索引的范围查询 5、index (type=index extra = using index 代表索引覆盖,即不需要回表) 6、all 全表扫描(通常没有建索引的列) 二、key_len 索引的长度,在不损失精度的情况下越短越好 三、ref 四、rows (内循环的次数) 五、extra 重要的几个 1、using temporary(组合查询返回的数据量太大需要建立一个临时表存储数据,出现这个sql应该优化) 2、using where (where查询条件) 3、using index(判断是否仅使用索引查询,使用索引树并且不需要回表查询) 4、using filesort(order by 太占内存,使用文件排序) 了解的几个 1、const row not found(据说是当表为空的时候展示,我用了个空表explain之后发现extra列是空值) 2、deleting all

DBA学习参考绝佳资料

泄露秘密 提交于 2020-01-13 03:57:21
原文来自: pursuer.chen 原文地址:https://www.cnblogs.com/chenmh/default.aspx?page=1 [置顶]MongoDB 文章目录 2018-02-09 10:27 by pursuer.chen, 144 阅读, 收藏 , 编辑 基础: MongoDB入门系列(一):基础概念和安装 MongoDB入门系列(二):Insert、Update、Delete、Drop MongoDB入门系列(三):查询(SELECT) MongoDB入门系列(四):权限管理 MongoDB入门系列(五):聚合操作 MongoDB 错误汇总 MongoDB 启动配置参数 集群: MongoDB 复制机制 MongoDB 搭建可复制群集 MongoDB 副本集管理 MongoDB 搭建分片集群 MongoDB 分片管理 MongoDB 分片键的选择与案例 OPS: 0 Comment [置顶]SQL Server 文章目录 2017-06-02 17:27 by pursuer.chen, 335 阅读, 收藏 , 编辑 SQL Server系列: 高可用方案: 搭建域服务器和DNS 搭建Windows故障转移群集 SQL Server Alwayson概念总结 SQL Server AlwaysOn搭建 SQL Server