sql优化

ORACLE数据库AWR工具学习

匆匆过客 提交于 2020-02-16 06:55:07
  AWR(Automatic Workload Repository)即工作负载信息库,主要用于收集数据库运行状态的资料库,通过AWR报告可以分析ORACLE数据库的性能,从而给出优化策略。    图一:此图来自网上    1、AWR的由来   10g之前的oracle:用户的连接将产生会话,当前会话记录保存在v$session中;处于等待状态的会话会被复制一份放在v$session_wait中。当该连接断开后,其原来的连接信息在v$session和v$session_wait中就会被删除;oracle10g及之后保留下了v$session_wait中的这些信息,并多了v$active_session_history(ASH)视图,记录每个活动session在v$session_wait中最近10次的等待事件。      ASH的采样数据是保存在内存中。而分配给ASH的内存空间是有限的,当所分配空间占满后,旧的记录就会被覆盖掉;而且数据库重启后,所有的这些ASH信息都会消失。这样,对于长期检测oracle的性能是不可能的。在Oracle10g中,提供了永久保留ASH信息的方法,这就是AWR。      由于全部保存ASH中的信息是非常耗费时间和空间的,AWR采用的策略是:每小时对v$active_session_history进行采样一次,并将信息保存到磁盘中,并且保留7天

SQL SERVER全面优化

你说的曾经没有我的故事 提交于 2020-02-16 06:53:05
今天我们从语句的一些优化写法及一些简单优化方法做一个介绍。这对于很多开发人员来说还是很有用的!为了方便阅读给出前文链接: SQL SERVER全面优化-------Expert for SQL Server 诊断系列 http://www.cnblogs.com/double-K/p/5538249.html 首先还是贴出我的座驾      好的语句就像这辆车,跑的又快又帅气!今天这里介绍一些技巧让你可以改装一下自己的车! 重中之重---语句执行顺序 在QQ群和人聊天的时候突然有位群友说:我才知道原来语句走索引是按照select 的字段筛选的! 振振有词,非常肯定!另一个群友反问update呢 ? 看起来很小白的问题,但确实让我很震惊!所以我们先看看语句的执行顺序 如果我没记错这是《SQL SERVER 2005技术内幕--查询》这本书的开篇第一章第一节。书的作者也要让读者首先了解语句是怎么样的一个执行顺序,因为不知道顺序何谈写个好语句? 查询的逻辑执行顺序: (1) FROM < left_table> (2) ON < join_condition> (3) < join_type> JOIN < right_table> (4) WHERE < where_condition> (5) GROUP BY < group_by_list> (6) WITH {cube |

6、数据库常见管理应用

心已入冬 提交于 2020-02-16 01:20:23
mysql建库的字符集为latin1,客户端的字符集为utf8; 6.1、创建数据库: 1、命令语法: create database <数据库名称>; #注意数据库名不能以数字开头; 2、命令: mysql> create database lc; Query OK, 1 row affected (0.11 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | lc | | mysql | | performance_schema | | wordpress | +--------------------+ 5 rows in set (0.19 sec) 6.2、显示数据库: 1、显示所有数据库: mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | lc | | lc1 | | lc2 | | mysql | | performance_schema | | wordpress | +--------------------+ 7 rows in

面试官系列,深入数据库分区分库分表

做~自己de王妃 提交于 2020-02-15 17:53:53
一、为什么要分库分表 软件时代,传统应用都有这样一个特点:访问量、数据量都比较小,单库单表都完全可以支撑整个业务。随着互联网的发展和用户规模的迅速扩大,对系统的要求也越来越高。因此传统的MySQL单库单表架构的性能问题就暴露出来了。而有下面几个因素会影响数据库性能: 数据量 MySQL单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而变弱。MySQL单表的数据量是500w-1000w之间性能比较好,超过1000w性能也会下降。 磁盘 因为单个服务的磁盘空间是有限制的,如果并发压力下,所有的请求都访问同一个节点,肯定会对磁盘IO造成非常大的影响。 数据库连接 数据库连接是非常稀少的资源,如果一个库里既有用户、商品、订单相关的数据,当海量用户同时操作时,数据库连接就很可能成为瓶颈。 为了提升性能,所以我们必须要解决上述几个问题,那就有必要引进分库分表,当然除了分库分表,还有别的解决方案,就是NoSQL和NewSQL,NoSQL主要是MongoDB等,NewSQL则以TiDB为代表。 二、分区分库分表的原理 1、什么是分区、分表、分库 (1)分区 就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的,分区实现比较简单,数据库mysql、oracle等很容易就可支持。 (2)分表

ORM操作

柔情痞子 提交于 2020-02-15 12:33:17
必知必会13条 # 得到是queryset对象 all() # 查询所有结果 filter() # 过滤 exclude() # 排除 values() # 以字典的形式储存在对象列表里 values_list() # 以字典中的值的形式数据存放在元组里 order_by() # 排序 reverse() # 翻转 distinct() #从返回结果中剔除重复纪录 # 得到的是对象: get() # 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 first() # 返回第一条记录 last() # 返回最后一条记录 # 其他: count() # 返回数据库中匹配查询(QuerySet)的对象数量。 exists() # 返回布尔值 基于字段的查询 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven") #

数据库底层结构

可紊 提交于 2020-02-15 07:37:26
数据库底层结构图: (1)链接层: 主要提供与客户端的链接服务,判断权限,进行链接限制等等。 创建好链接后下一步把请求发给服务层。 (2)服务层: 解析SQL语句,使用SQL优化器对SQL语句进行重排序,再进行优化。 对热点数据和已经查询过的数据有进行部分缓存。 提供其他各种各样的接口供用户使用。 (3)引擎层: innodb和myisam的两种不同的表引擎,分别对应不同的存储数据方式和查找数据的方式。 (4) 存储层: 对处理后的数据和传入的数据进行保存操作。 来源: CSDN 作者: 凉拌海蜇丝 链接: https://blog.csdn.net/whiteBearClimb/article/details/104319541

Mysql表连接

浪子不回头ぞ 提交于 2020-02-14 12:32:26
当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。 从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们最常用的是内连接。 例如:查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表emp 和dept 中,因此,需要使用表连接来进行查询: select ename,deptname from emp,dept where emp.deptno=dept.deptno; ename是表emp里的字段 deptname是表dept里的字段 条件表示查出表emp和表dept里deptno相同的记录 再连接成一条记录,从这记录里查出ename和deptname字段 外连接有分为左连接和右连接,具体定义如下: 左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录 右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录 左连接:select ename,deptname from emp left join dept on emp.deptno=dept.deptno;右连接:select ename,deptname from dept right join emp on dept.deptno=emp.deptno; 这两个查出来是一模一样的记录

Lucene第一篇【介绍Lucene、快速入门】

落爺英雄遲暮 提交于 2020-02-13 23:53:56
什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个 全文检索引擎的架构 ,提供了完整的创建索引和查询索引,以及部分文本分析的引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎,Lucene在全文检索领域是一个经典的祖先,现在很多检索引擎都是在其基础上创建的,思想是相通的。 Lucene是根据关健字来搜索的文本搜索工具,只能在某个网站内部搜索文本内容,不能跨网站搜索 既然谈到了网站内部的搜索,那么我们就谈谈我们熟悉的百度、google那些搜索引擎又是基于什么搜索的呢…. 从图上已经看得很清楚, baidu、google等搜索引擎其实是通过网络爬虫的程序来进行搜索的 … 为什么我们要用Lucene? 在介绍Lucene的时候,我们已经说了:Lucene又不是搜索引擎,仅仅是在 网站内部 进行 文本 的搜索。那我们为什么要学他呢??? 我们之前编写纳税服务系统的时候,其实就已经 使用过SQL来进行站内的搜索 .. 既然SQL能做的功能,我们还要学Lucene,为什么呢??? 我们来看看我们用SQL来搜索的话,有什么缺点: (1)SQL只能针对数据库表搜索, 不能直接针对硬盘上的文本搜索

MySQL数据库的SQL语句优化方法

梦想的初衷 提交于 2020-02-13 23:52:10
1、使用 show status 了解各种 SQL 的执行频率 mysql> show status like 'Com%'; 该命令可以查询 sql 命令的执行次数。 2、定位执行效率较低的 SQL 语句 定位执行效率较低的 SQL 一般有两种方法: 通过慢查询日志定位效率低的 SQL,用 --log-show-queries[=file_name] 该选项启动; 慢查询日志在查询结束后才会记录,所以在应用执行效率出现问题的时候慢查询日志不能定位问题,这时可以使用 show processlist 命令查看当前 MySQL 在执行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化; 3、通过 explain 分析低效 SQL 的执行计划 all < index < range < ref < eq_ref < const, system < null 以上常见的访问类型 从左至右,性能又差到好 。 ALL:全表扫描, MySQL 遍历全表来匹配行; index:索引扫描,MySQL 遍历整个索引来查询匹配的行; range:索引范围扫描,常见于 <、<=、>、>=、between 等操作符; ref:使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行; eq_ref:类似 ref,区别就在使用的索引是唯一索引

从原理到优化,深入浅出数据库索引

半世苍凉 提交于 2020-02-13 23:44:06
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化,这篇文章对索引做一个系统的梳理,希望对大家有帮助。 一、MySQL有哪些索引类型 索引的分类可以从多个角度进行,下面分别从数据结构,物理存储和业务逻辑三个维度进行划分。 1、从数据结构角度 (1)B+树索引(O(log(n))) 关于B+树索引,后面会深入解析 (2)hash索引 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 只有Memory存储引擎显示支持hash索引 (3)FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 (4)R-Tree索引 用于对GIS数据类型创建SPATIAL索引 2、从物理存储角度 (1)聚集索引(clustered index) 正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引; Innodb存储引擎中行记录就是按照聚集索引维度顺序存储的,Innodb的表也称为索引表;因为行记录只能按照一个维度进行排序