sql优化

MySQL explain命令详解

为君一笑 提交于 2020-02-13 21:02:30
使用explain + sql语句可以得到该条sql语句的执行计划,具体信息如下 下面将依次介绍每个字段的含义 id id表示在多表查询时,表的执行顺序,它是一组数字序列号,表示查询中执行select子句或操作表的顺序,其取值分为以下三种情况 1.id相同,表示表的执行顺序由上至下 上例中,表示该sql语句执行时对三张表的查询顺序是先查询t1,再查询t3,最后查询t3 2.id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 上例中,表示该sql语句执行时对三张表的查询顺序是先查询t3,再查询t2,最后查询t1 3.id有相同值也有不同值,id值越大越先被执行,id值相同自上而下顺序执行 上例中,t3表最先被查询,第二个被查询的并不是一张真实的表,而是一张衍生表derived2,它是表t3的查询结果,也就是将上一步中t3的查询结果作为一张表来进行查询,该衍生表的命名方式是derived+2(2 表示由 id =2 的查询衍生出来的表)。最后被查询的表是t2。 select_type select_type表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询,其值主要有以下几种情况 1.SIMPLE:简单的 select 查询,查询中不包含子查询或者UNION,实例如下 2.PRIMARY:查询中若包含任何复杂的子部分

sqlserver浅谈

我只是一个虾纸丫 提交于 2020-02-13 14:02:31
Sqlserver 一、 Sqlserver简介 SQL Server一开始并不是微软自己研发的产品,而是当时为了要和 IBM 竞争时,与 Sybase 合作所产生的,其最早的发展者是 Sybase [1] ,同时微软也和 Sybase合作过SQL Server 4.2版本的研发,微软亦将SQL Server 4.2移植到 Windows NT (当时为 3.1版),在与Sybase终止合作关系后,自力开发出SQL Server 6.0版,往后的SQL Server即均由微软自行研发。 在与微软终止合作关系后, Sybase在Windows NT上的数据库产品原本称为Sybase SQL Server,后来改为现在的Sybase Adaptive Server Enterprise 。 Sqlserver 6.0之前版本都是与sybase联合研发,在SQL Server for Windows NT 之后从 sybase手中买断sqlserver著作权开始自主研发。Sqlserver 2017开始支持linux系统。 二、 Sqlserver架构 Sqlserver 架构与 mysql 、 oracle 不同(在 SQL 2000 数据库用户名称架构是绑定的, 一个完整的表的名称包括 了 服务器名 .数据库名.用户名.对象名 , 2005时为 服务器名 .数据库名.架构名.对象名

2014年小结之sql语句优化

混江龙づ霸主 提交于 2020-02-13 09:04:33
之前接手一个数据统计处理的小程序,本来逻辑上并没什么,只是数据量略大,某些表的数据达到了千万级别..因为是统计,所以免不了各种连接各种查询,结果这个小程序写完后运行一次要1个小时..这的确有点出乎意料,所以着手优化一下.. 1.添加索引 平时不注意或是数据量比较小的时候可能会忽略这个,加或是不加基本没差别,但是当数据量很大的时候差别就非常明显,没有索引的情况下,在1万条以内和10万条以上的数据中查询所用的时间差别已经能分辨出了.这里有2点需要特别注意: 1)默认情况下我们创建表,数据库会自动给我们添加一个默认索引,但是当采用 create table 表名 as select 语句创建表时,数据库是不会自动创建索引的,此时我们需要手动添加索引. 2)哪些字段需要添加索引?那些在我们查询语句中起到桥梁(连接)作用的字段需要添加索引.因为只有在查询条件中包含有索引字段才能享用索引带来的速度提升. 可以说索引是提高查询速度最明显最简单的方法,它可以令一个数分钟的查询在毫秒内完成,效率提升不是一点半点.. 2.缩小查询集合 既然是查询,那一定有要查询的集合,也就是 from 后面的集合.如果能缩小这个集合,那么查询遍历一遍的时间也会缩减不少,整体的查询时间自然会减少.主要有几个手段: 1)创建临时查询表.如果一个表的数据量很大,而我们只在其中满足某些特定条件的数据集合中查询

MySQL查看SQL语句执行效率

萝らか妹 提交于 2020-02-13 08:06:17
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。 Explain语法:explain select … from … [where ...] 例如:explain select * from news; 输出: +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ 下面对各个属性进行了解: 1、id:这是SELECT的查询序列号 2、select_type:select_type就是select的类型,可以有以下几种: SIMPLE:简单SELECT(不使用UNION或子查询等) PRIMARY

知乎上看的文章

為{幸葍}努か 提交于 2020-02-12 22:15:35
作者:暗灭 链接:https://www.zhihu.com/question/26669731/answer/466936797 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 想了想,还是先画一系列的图,再来解释一下什么是WEB开发. 第一层 入门介绍图 适合:刚入门互联网,没多少基础知识和专业知识. 为嘛这个图上传的不清楚?算了.我也不知道 对于大多数刚刚接触到互联网这个职业的人来说,对于软件是怎么编写的,大概的职业是怎么划分的,理解到这个程度就够了. 整个系统架构可以分成三层(分层是码农必备思维). 第一层,叫展示层,又被称之为前端.展示层这个名字,其实有点不精确,确切的来说,应该叫用户层,或者是输入输出层,或者叫用户交互层. 它的目标很简单,就是接受用户的输入,并将结果反馈给用户. 什么叫做输入呢?键盘,鼠标,声音,图像等等都是输入,最简单的输入就是键盘和鼠标,你们如果看过各种黑客电影,不管是在键盘上啪啪啪,还是在空气中点点点,都是输入. 输出就是展示出来的结果,在屏幕上就是文字动画,在音箱就是声音之类的. 叫展示层的原因,是因为大部分的情况下,都是用户只需要看,少部分才是操作. 所以通常是用展示层来代指用户的输入输出层. 为什么要分层? 其实最早在互联网没有出现之前,分层是一个相对而言,软件设计里的概念.但是在现在,就很简单了

PL/SQL连接Oracle数据库及优化

六月ゝ 毕业季﹏ 提交于 2020-02-12 22:06:50
系统:windows7旗舰版 64位。oracle数据库服务器版本:oracle11g。oracle数据库客户端版本:64位 Version 12.2.0.1.0。PL/SQL版本:【Version 12.0.7.1837(64 bit)】。 一、下载: 1、官网下载: 官网下载速度慢,不推荐,官网网址【https://www.allroundautomations.com】,有兴趣的小伙伴可以去看看。 2、其他下载: 现在网上有许多资源,百度一下,找到合适的版本下载即可,或者到CSDN【网址:https://www.csdn.net】搜PL/SQL Developer有很多上传的资源,小伙伴们可以根据自己的需要下载不同版本。需要安装的根据提示确定安装即可,免安装的解压即可。需要注册码的,这里就不贴了,网上有很多,还是百度一下、哈哈 二、连接数据库: 1、前置条件: 已安装oracle数据库服务器 已安装oracle数据库客户端 2、找到首选项: 通过桌面图标,或者到PL/SQL目录下,找到【plsqldev.exe】鼠标左键双击启动,登录界面点击【Cancel】,先进入主界面: 进入PL/SQL主界面,点击上方的首选项: 3、配置【Oracle Home】和【OCI library】: 【Oracle Home】:即oracle客户端安装的位置 (我的是在D:\apps\dev

SQL语句常见优化十大案例

混江龙づ霸主 提交于 2020-02-12 21:13:14
1、慢SQL消耗了70%~90%的数据库CPU资源; 2、SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低; 3、SQL语句可以有不同的写法; 1.不使用子查询 SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang'); 子查询在MySQL5.5版本里,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表t2,当外表的数据很大时,查询速度会非常慢。 在MariaDB10/MySQL5.6版本里,采用join关联方式对其进行了优化,这条SQL会自动转换为 SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id; 但请注意的是:优化只针对SELECT有效,对UPDATE/DELETE子查询无效,固生产环境应避免使用子查询 2.避免函数索引 例: SELECT * FROM t WHERE YEAR(d) >= 2016; 由于MySQL不像Oracle那样支持函数索引,即使d字段有索引,也会直接全表扫描。 应改为-----> SELECT * FROM t WHERE d >= '2016-01-01'; 3.用IN来替换OR 低效查询 SELECT * FROM t WHERE LOC_ID = 10

[内功修神]MySQL高级

自古美人都是妖i 提交于 2020-02-12 15:16:04
个人博客文章地址 文章目录 1. mysql的架构介绍 1.2. Mysql逻辑架构介绍 2. 索引优化分析 2.1. 常见通用的join查询 2.2. 索引简介 2.2.1. 定义:排好序的快速查找数据结构 2.2.2. 优势 2.2.3. 劣势 2.2.4. mysql索引分类 2.2.5. mysql索引结构 2.2.6 哪些情况需要创建索引 2.2.7 哪些情况不要创建索引 2.3. 性能分析 2.3.1 MySQL Query Optimizer![在这里插入图片描述](https://img-blog.csdnimg.cn/20200212101223600.png) 2.3.2 MySQL常见瓶颈 2.3.3 Explain 2.3.3.1 是什么(查看执行计划) 2.3.3.2 能干嘛 2.3.3.3 怎么玩 2.3.3.4 各个字段解释 2.3.4 索引优化 2.3.4.1 索引失效(应该避免) 2.3.4.1 一般性建议 3. Mysql锁机制 3.1 锁的分类 3.2 三锁 3.2.1 表锁(偏读) 3.2.2 行锁(偏写) 3.2.3 页锁 4. 主重复制 1. mysql的架构介绍 1.2. Mysql逻辑架构介绍 查看命令 MyISAM和InnoDB 2. 索引优化分析 2.1. 常见通用的join查询 SQL执行顺序 join图 2.2. 索引简介 2

sql优化

六眼飞鱼酱① 提交于 2020-02-12 11:32:53
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t where num=20 5.下面的查询也将导致全表扫描: select id from t where name like '%abc%' 若要提高效率,可以考虑全文检索。 6. in 和 not in 也要慎用,否则会导致全表扫描,如: select id from t where num in(1,2,3) 对于连续的数值,能用 between

Mysql 笔记(一)

感情迁移 提交于 2020-02-12 10:35:24
InnoDB存储引擎 mysql 存储引擎(好难用,看 https://www.zybuluo.com/eqyun/note/27850 ) 简介 InnoDB是事务安全的MySQL存储引擎,从MySQL5.5版本开始是默认的表存储引擎,是第一个完整支持 ACID事务 的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性锁定读,同时被设计用来最有效地利用以及使用内存和CPU InnoDB存储引擎体系架构 后台线程(多个)->InnoDB存储引擎内存池->物理文件 后台线程 1. Master Thread 核心的后台线程,负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲(INSERT BUFFER)、 UNDO页的回收等 2. IO Thread 在InnoDB中大量使用了AIO(Async IO)来处理IO 请求,IO Thread主要是负责这些IO请求的回调处理。Io Thread共有4类: write 、 read 、 insert buffer 和 log IO thread 。在InnoDB 1.0.x 版本开始,read thread和write thread分别增加大4个,用 innodb_file_io_threads 和 innodb_write_io_threads 参数来设置,如 可以看到thread