sql优化

【mysql】Innodb三大特性之insert buffer

旧城冷巷雨未停 提交于 2020-01-26 12:33:27
一、什么是insert buffer insert buffer是一种特殊的数据结构(B+ tree) 并不是缓存的一部分,而是物理页 , 当受影响的索引页不在buffer pool时 缓存 secondary index pages的变化, 当buffer page读入buffer pool时 ,进行合并操作,这些操作可以是 INSERT , UPDATE , or DELETE operations (DML) 最开始的时候只能是insert操作,所以叫做insert buffer,现在已经改叫做change buffer了 insert buffer 只适用于 non-unique secondary indexes 也就是说 只能用在非唯一的索引上 ,原因如下 1、primary key 是 按照递增的顺序进行插入的,异常插入聚族索引一般也顺序的,非随机IO 2 写唯一索引要检查记录是不是存在,所以在修改唯一索引之前,必须把修改的记录相关的索引页读出来才知道是不是唯一、这样Insert buffer就没意义了,要读出来(随机IO) 所以只对非唯一索引有效 二、insert buffer的原理 对于为非唯一索引,辅助索引的修改操作并非实时更新索引的叶子页,而是把若干对同一页面的更新缓存起来做,合并为一次性更新操 作, 减少IO,转随机IO为顺序IO

MySQL8.0新特性【转】

China☆狼群 提交于 2020-01-26 11:50:32
Server层,选项持久化 mysql> show variables like '%max_connections%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | max_connections | 512 | | mysqlx_max_connections | 100 | +------------------------+-------+ 2 rows in set (0.00 sec) mysql> set persist max_connections=8000; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%max_connections%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | max_connections | 8000 | | mysqlx_max_connections | 100 | +------------------------+-------+ 2 rows

Oracle Sql 胡乱记

时间秒杀一切 提交于 2020-01-26 11:20:37
/ Oracle查询优化改写 / --1、coalesce 返回多个值中,第一个不为空的值 select coalesce('', '', 's') from dual; --2、order by -----dbms_random.value 生产随机数,利用随机数对查询结果进行随机排序 select * from emp order by dbms_random.value; --指定查询结果中的一列进行排序 select * from emp order by 4; -----order by 中认为null是最大所以null会排在第一或者最后一个 -----可以利用 nulls first 或者 nulls last 对null进行排序处理 select * from emp order by comm nulls first; select * from emp order by comm nulls last; ----- 多列排序,job 降序排列,如果工作一样,按照工号升序排列 select * from emp order by job desc, empno asc; ------依次按照job,empno降序排序 select * from emp order by job, empno desc; ------将empno = 7934 的排在第一位

mysql的基本用法

拟墨画扇 提交于 2020-01-26 11:13:22
#登录数据库 mysql -hlocalhost -uroot -p; #修改密码 mysqladmin -uroot -pold password new; #显示数据库 show databases; #显示数据表 show tables; #选择数据库 use examples; #创建数据库并设置编码utf-8 多语言 create database `examples` default character set utf8 collate utf8_general_ci; #删除数据库 drop database examples; #创建表 create table test( id int (10) unsigned zerofill not null auto_increment, email varchar (40) not null , ip varchar (15) not null , state int (10) not null default '-1' , primary key (id) )engine=InnoDB; #显示表结构 describe #删除表 drop table test; #重命名表 alter table test_old rename test_new; #添加列 alter table test add cn int (4

ORACLE SQL性能优化系列 (一)

久未见 提交于 2020-01-26 09:00:37
1. 选用适合的 ORACLE 优化器 ORACLE 的优化器共有 3 种 : a. RULE ( 基于规则 ) b. COST ( 基于成本 ) c. CHOOSE ( 选择性 ) 设置缺省的优化器 , 可以通过对 init.ora 文件中 OPTIMIZER_MODE 参数的各种声明 , 如 RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在 SQL 句级或是会话 (session) 级对其进行覆盖 . 为了使用基于成本的优化器 (CBO, Cost-Based Optimizer) , 你必须经常运行 analyze 命令 , 以增加数据库中的对象统计信息 (object statistics) 的准确性 . 如果数据库的优化器模式设置为选择性 (CHOOSE), 那么实际的优化器模式将和是否运行过 analyze 命令有关 . 如果 table 已经被 analyze 过 , 优化器模式将自动成为 CBO , 反之 , 数据库将采用 RULE 形式的优化器 . 在缺省情况下 ,ORACLE 采用 CHOOSE 优化器 , 为了避免那些不必要的全表扫描 (full table scan) , 你必须尽量避免使用 CHOOSE 优化器 , 而直接采用基于规则或者基于成本的优化器 . 2. 访问 Table 的方式 ORACLE

SQL Server——存储过程

不打扰是莪最后的温柔 提交于 2020-01-26 02:54:13
我想从下面几个方面大概的讲述下存储过程,可能有些知识点是你没有注意的,也可能有些知识点我不知道,欢迎大家指点指点。如有不足,欢迎指教! 存储过程概念 存储过程优点 存储过程的接口 存储过程的解析、编译过程 存储过程安全性 查看存储过程 加密、解密存储过程 存储过程概念 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(带参存储过程)来执行它。 存储过程优点 开发过程中使用存储过程的优点, 概括起来大体有下面一些: 1: 速度快、性能好。存储过程是一组已经编译过的SQL脚本,它已经进过解析、编译、优化器优化。调用存储过程可以 重复使用它的缓存执行计划。这样节省了解析、分析等所 需消耗的CPU资源。时间 2: 存储过程存储在数据库服务器,可以减少网络通信,减少网络阻塞。 调用存储过程只需存储过程名字和参数,从而避免了 把长串的SQL语句传送到SQL 服务器,可以大大减 轻网络负担。 3: 业务逻辑封装,可以把相当一部分业务逻辑封装到存储过程中,当业务逻辑变更的时候,只要接口不变,只需修改存储过程内部逻辑就OK了,避免了业务逻辑放在代码层,业务 逻辑变动改动大的痛苦。 4: 安全性 参数化的存储过程可以减少SQL Injiection攻击,而且可以通过检验参数、授予对象执行权限提高了安全性。

SQL 优化原则

流过昼夜 提交于 2020-01-26 01:55:44
   一、问题的提出  在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优 化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的 SQL语句,提高系统的可用性。   在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的 SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种 原则来删除索引,这有助于写出高性能的SQL语句。   二、SQL语句编写注意问题   下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。    1. IS NULL 与 IS NOT NULL    不能用null作索引

MySQL优化技巧【持续更新】

冷暖自知 提交于 2020-01-26 01:50:06
前言 应用程序或web网页有时慢的像蜗牛爬似的,可能是网络原因,可能是系统架构原因,还有可能是数据库原因。那么如何提高数据库SQL语句执行速度呢?下面是积累的一些优化技巧,望对君有用。 正文 1、比较运算符能用 “=”就不用“<>” //“=”增加了索引的使用几率。 2、明知只有一条查询结果,那请使用 “LIMIT 1” “LIMIT 1”可以避免全表扫描,找到对应结果就不会再继续扫描了。 3、为列选择合适的数据类型 //能用TINYINT就不用SMALLINT,能用SMALLINT就不用INT,道理你懂的,磁盘和内存消耗越小越好嘛。 4、将大的DELETE,UPDATE or INSERT 查询变成多个小查询 能写一个几十行、几百行的SQL语句是不是显得很高大上?然而,为了达到更好的性能以及更好的数据控制,你可以将他们变成多个小查询。 5、使用UNION ALL 代替 UNION,如果结果集允许重复的话 //因为 UNION ALL 不去重,效率高于 UNION。 6、为获得相同结果集的多次执行,请保持SQL语句前后一致 这样做的目的是为了充分利用查询缓冲。 7、尽量避免使用 “SELECT *” //如果不查询表中所有的列,尽量避免使用 SELECT *,因为它会进行全表扫描,不能有效利用索引,增大了数据库服务器的负担,以及它与应用程序客户端之间的网络IO开销。 8、WHERE

mysql(2):索引

假如想象 提交于 2020-01-26 00:08:10
索引基础 索引介绍 定义 索引是满足某种特定查找算法的数据结构。这些数据结构会以某种方式指向数据,从而实现高效查找。 优势 提高了查询速度 劣势 降低更新表的速度,因为更新表时,MySQL不仅要保存数据,还要保存索引文件。 建立索引会占用磁盘空间的索引文件。 索引分类 主键索引 根据主键pk_column(length)建立索引, 不允许重复,不允许空值 。 ALTER TABLE 'table_name' ADD PRIMARY KEY pk_index('col'); 唯一索引UNIQUE 用来建立索引的列的值必须是 唯一的,允许空值 。 ALTER TABLE 'table_name' ADD UNIQUE INDEX index_name('col'); 普通索引 用 普通列 构建的索引,没有任何限制。 ALTER TABLE 'table_name' ADD INDEX index_name('col'); 组合索引 用多个列组合构建的索引,这多个列中的值不允许有空值。 ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3'); 遵循“最左前缀”原则,把最常用作为检索或排序的列放在最左,依次递减,组合索引 相当于建立了col1,[col1,col2],[col1,col2,col3]三个索引

Mysql中索引的 创建,查看,删除,修改

我的梦境 提交于 2020-01-26 00:02:15
1,MySQL创建索引 MySQL创建索引的语法如下: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_name (index_col_name,...) 其中对应的语法变量信息如下: [UNIQUE|FULLTEXT|SPATIAL] 中括号中的这三个关键字表示创建的索引类型,它们分别表示唯一索引、全文索引、空间索引三种不同的索引类型。如果我们不指定任何关键字,则默认为普通索引。 index_name index_name表示索引的名称,由用户自行定义,以便于以后对该索引进行修改等管理操作。 index_type index_type表示索引的具体实现方式,在MySQL中,有两种不同形式的索引——BTREE索引和HASH索引。在存储引擎为MyISAM和InnoDB的表中只能使用BTREE,其默认值就是BTREE;在存储引擎为MEMORY或者HEAP的表中可以使用HASH和BTREE两种类型的索引,其默认值为HASH。 index_col_name index_col_name表示需要创建索引的字段名称,我们还可以针对多个字段创建复合索引,只需要在多个字段名称之间以英文逗号隔开即可。 此外,对于CHAR或VARCHAR类型的字段,我们还可以只使用字段内容前面的一部分来创建索引