sql优化

MySQL两种引擎的比较

老子叫甜甜 提交于 2020-03-20 05:14:49
MyISAM,InnoDB主要区别:    1.MyISAM是非事物安全的,InnoDB是事物安全的。     事物安全的特点为更安全,遇到问题会自动恢复或从备份加事物日志回复,如果更新失败,你的所有改变都变回原来。     非事物安全的优点为更快,所需的磁盘空间更小,执行更新时需要的内存更小,但是所有发生的改变都是永久的。   2.MyISAM锁的粒度是表级的,InnoDB支持行级锁以及表级,默认情况下是采用行级锁。      数据库引擎具有多粒度锁定,允许一个事务锁定不同类型的资源。 为了尽量减少锁定的开销,数据库引擎自动将资源锁定在适合任务的级别。 锁定在较小的粒度(例如行)可以提高并发度,但开销较高,因为如果锁定了许多行,则需要持有更多的锁。 锁定在较大的粒度(例如表)会降低了并发度,因为锁定整个表限制了其他事务对表中任意部分的访问。 但其开销较低,因为需要维护的锁较少。    3. MyISAM 支持全文类型索引,InnoDB不支持( 之前 ) 。     mysql索引有四种类型:主键索引、唯一索引、普通索引和全文索引。通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力。索引优化是mysql中的一种优化方式。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。     主键索引: 主键是一种唯一性索引,但它必须指定为PRIMARY

MySQL:性能优化之数据类型,SQL,八种连接

南笙酒味 提交于 2020-03-19 17:52:54
一、mysql数据类型优化原则 (1) 能够使用最小数据类型存储时,尽量使用最小数据类型存储(前提是要评估字段值的真实数据存储范围)      eg:create table aaa(id1 int(10) zerofill,id2 int (10));  (1) int(n) 中的 n代表宽度,表示没有设定宽度的时候,用0填充,需要配合zerofill来使用。 eg: insert into aaa values(12,11); (2) varchar 存储变长的字符串,即根据存入的值的长度来动态变化 存储空间:   非空:65533字节   可空:65532字节 优点:节省空间,操作简单 缺点:在update的时候,如果数据的长度变化了,就会去申请空间,从而有额外的工作,对性能有影响。 应用场景:1.字符串最大长度比平均真实值大的比较多,这个时候就会用。    2.更新频率比较低的字符串字段 (3) char 存储定长的字符串 存储长度:create table t (char(10) not null)   非空:存储255字节   可空:存储254字节 应用场景:   1.适合存储比较短的字符串   2.存储固定的长度或者存储长度比较接近的字符串     例如:手机号、MD5加密的密码、邮编等   3.经常变更的数据(不需要释放空间重新申请,即不会产生内存碎片)   4

Mysql数据库分区和分表

安稳与你 提交于 2020-03-19 17:37:39
3 月,跳不动了?>>> 一: 分区简介 分区是根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库应用而言,逻辑上就只有一个表或者一个索引,但实际上这个表可能有N个物理分区对象组成,每个分区都是一个独立的对象,可以独立处理,可以作为表的一部分进行处理。分区对应用来说是完全透明的,不影响应用的业务逻辑。 分区有利于管理非常大的表,它采用分而治之的逻辑,分区引入了分区键的概念,分区键用于根据某个区间值(或者范围值)、特定值列表或者hash函数值执行数据的聚集,让数据根据规则分布在不同的分区中,让一个大对象碧昂城一些小对象。 MySQL分区即可以对数据进行分区也可以对索引进行分区。 分区类型 range分区:基于一个给定的连续区间范围(区间要求连续并且不能重叠),把数据分配到不同的分区 list分区:类似于range分区,区别在于list分区是居于枚举出的值列表分区,range是基于给定的连续区间范围分区 hash分区:基于给定的分区个数,把数据分配到不同的分区 key分区:类似于hash分区 注意:无论哪种分区,要么你分区表上没有主键/唯一键,要么分区表的主键/唯一键都必须包含分区键,也就是说不能使用主键/唯一键字段之外的其它字段分区。 ####MySQL分区的有限主要包括以下4个方面: 和单个磁盘或者文件系统分区相比,可以存储更多数据 优化查询

50个经典Sql语句

会有一股神秘感。 提交于 2020-03-19 05:53:05
50个经典Sql语句 --1.学生表 Student(S,Sname,Sage,Ssex) --S 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(C,Cname,T) --C --课程编号,Cname 课程名称,T 教师编号 --3.教师表 Teacher(T,Tname) --T 教师编号,Tname 教师姓名 --4.成绩表 SC(S,C,score) --S 学生编号,C 课程编号,score 分数 */ --创建测试数据 create table Student(S varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10)) insert into Student values('01' , N'赵雷' , '1990-01-01' , N'男') insert into Student values('02' , N'钱电' , '1990-12-21' , N'男') insert into Student values('03' , N'孙风' , '1990-05-20' , N'男') insert into Student values('04' , N'李云' , '1990-08-06' , N'男') insert into

MySQL 中的数据类型介绍

无人久伴 提交于 2020-03-19 00:50:12
1、MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 2、数值类型(12) 2.1、整数类型(6) 一张图就能解释清楚了: INTEGER同INT。 2.2、定点数(2) DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值。 使用方式如下: salary DECIMAL ( 5 , 2 ) 下面的介绍将基于上面这个例子。 我们看到其中有两个参数,即DECIMAL(M,D),其中M表示十进制数字总的个数,D表示小数点后面数字的位数,上例中的取值范围为-999.99~999.99。 如果存储时,整数部分超出了范围(如上面的例子中,添加数值为1000.01),MySql就会报错,不允许存这样的值。 如果存储时,小数点部分若超出范围,就分以下情况: 若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。如999.994实际被保存为999.99。 若四舍五入后,整数部分超出范围,则MySql报错,并拒绝处理。如999.995和-999.995都会报错。 M的默认取值为10,D默认取值为0。如果创建表时,某字段定义为decimal类型不带任何参数,等同于decimal(10,0)。带一个参数时

Oracle 执行计划(Explain Plan) 说明

别来无恙 提交于 2020-03-19 00:22:49
如果要分析某条 SQL 的性能问题,通常我们要先看 SQL 的执行计划,看看 SQL 的每一步执行是否存在问题。 如果一条 SQL 平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以断定是执行计划出了问题。 看懂执行计划也就成了 SQL 优化的先决条件。 这里的 SQL 优化指的是 SQL 性能问题的定位,定位后就可以解决问题。 一. 查看执行计划的三种方法 1.1 设置 autotrace 序号 命令 解释 1 SET AUTOTRACE OFF 此为默认值,即关闭 Autotrace 2 SET AUTOTRACE ON EXPLAIN 只显示执行计划 3 SET AUTOTRACE ON STATISTICS 只显示执行的统计信息 4 SET AUTOTRACE ON 包含 2,3 两项内容 5 SET AUTOTRACE TRACEONLY 与 ON 相似,但不显示语句的执行结果 SQL> set autotrace on SQL> select * from dave; ID NAME ---------- ---------- 8 安庆 1 dave 2 bl 1 bl 2 dave 3 dba 4 sf-express 5 dmm 已选择 8 行。 执行计划 --------------------------------------

mysql之零碎知识

泪湿孤枕 提交于 2020-03-18 23:33:53
一 视图  什么是视图:视图就是一张虚拟表。方便查看。  创建视图:create view 起名 as sql语句 #两张有关系的表 mysql> select * from course; +-----+--------+------------+ | cid | cname | teacher_id | +-----+--------+------------+ | 1 | 生物 | 1 | | 2 | 物理 | 2 | | 3 | 体育 | 3 | | 4 | 美术 | 2 | +-----+--------+------------+ 4 rows in set (0.00 sec) mysql> select * from teacher; +-----+-----------------+ | tid | tname | +-----+-----------------+ | 1 | 张磊老师 | | 2 | 李平老师 | | 3 | 刘海燕老师 | | 4 | 朱云海老师 | | 5 | 李杰老师 | +-----+-----------------+ 5 rows in set (0.00 sec) #查询李平老师教授的课程名 mysql> select cname from course where teacher_id = (select tid from

第七章——设计和调整索引

杀马特。学长 韩版系。学妹 提交于 2020-03-18 21:44:41
要定义一个在任何地方都有效的索引策略是不可能的。因为每个系统都是独一无二的,都需要基于工作量的索引方法,业务需求和其他的一些因素。然而,有一些设计方面的考虑和准则,可以适用于每一个系统。 当我们要优化现有系统时,也是这样。而优化是一个迭代过程,每个案例中都是独一无二的,有一系列技术可以用来检测数据库系统每个案例中的低效率的例子。 在本章中,我们将介绍一些重要的因素,在设计新索引和优化现有系统时需要牢记这些因素。 分类索引设计考虑因素 每次更改聚集索引键的值,都会发生两件事。第一件事就是sql服务器在聚集索引页链和数据文件中把行移动到不同位置。第二,它更新聚集索引键的行号。所有非聚集索引都要存储、更新行标识。但就 输入 /输出端口而言,在批量更新的情况下会 特别很贵。而且,在行 id大小增加的情况下,它会增加群集索引和非群集索引的碎片化。因此,最好是有一个静态的聚集索引,因为它关键值不会改变。 所有非聚集索引都使用聚集索引键作为行 id。太宽泛的聚集索引键会增加非聚集索引行的大小,而且需要更多空间来存储它们。结果就是sql服务器在索引或范围扫描操作中需要处理更多的数据页,会索引降低效率。在非唯一非聚集索引的情况下,行id也存储在非叶索引级别,反过来,减少每页索引记录的数量,会导致索引中额外的中间级别。即使非叶索引级别通常缓存在内存中

SQL Server 2008之索引设计

十年热恋 提交于 2020-03-18 20:32:22
当 SQL Server 访问表中的数据时,它扫描表的所有页或者使用索引减少需要扫描的行;有时 SQL Server 会创建临时索引以提高查询性能,但是这样的行为不是数据库管理员或者程序员可控的行为,并且只针对单次查询;除标准类型索引外,还包括其他类型索引: Full Text Index :提供灵活的文本查询 Spatial Index :为 Geometry 、 Geography 类型创建的索引 Primary and Secondary XML Index :帮助查询 XML 数据 ANSI SQL 的定义中并没有描述索引,索引被认为是数据库内部实现细节, SQL Server 使用索引提高性能和实现特定的约束;当你创建主键或者对列指定了唯一性约束, SQL Server 自动在这些列上创建索引,这样在检测给定值是否存在时更快 对于列表中大量实体,树结构提供了快速查询的能力,二叉树很快会变得不平衡、不可用(因为二叉树要求每个节点只能拥有两个子节点,嵌套层次很深), SQL Server 中的索引是基于自平衡形式树,即 SQL Server 索引中每个节点允许多个节点,这样提高了索引的效率,避免深层次的嵌套 设计索引时的三个重要概念: Selectivity 可选择性:衡量相对于总行数每次查询返回的行数,可选择性越高返回的行数越少,索引设计越合理 density密度

Oracle分区表常用命令

老子叫甜甜 提交于 2020-03-18 19:39:52
一、Oracle分区简介 ORACLE的分区是一种处理超大型表、索引等的技术。分区是一种“分而治之”的技术,通过将大表和索引分成可以管理的小块,从而避免了对每个表作为一个大的、单独的对象进行管理,为大量数据提供了可伸缩的性能。分区通过将操作分配给更小的存储单元,减少了需要进行管理操作的时间,并通过增强的并行处理提高了性能,通过屏蔽故障数据的分区,还增加了可用性。 二、Oracle分区优缺点 ? 优点: 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能; 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。 ? 缺点: 分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。 三、Oracle分区方法 ? 范围分区: 范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。如根据序号分区,根据业务记录的创建日期进行分区等。 ? Hash分区(散列分区): 散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。 ? List分区(列表分区):