sql优化

Mybatis架构图,运行流程

ε祈祈猫儿з 提交于 2020-01-14 02:41:31
MyBatis本质 就是代理模式体现;MyBatis作者思想认为JDBC开发流程中所有的步骤都是次要业务,认为SQL编写主要任务。开发人员专注于SQL编写应该忽略JDBC开发流程,轻度体现ORM思想。 MyBatis与Hibernate比较 Hibernate:杜绝开发人员亲自使用JDBC,杜绝亲自编写用sql命令,Hibernate无法SQL优化,Hiberante缓存依赖程度过大,一级缓存如何同步二级缓存 MyBatis:杜绝开发人员亲自使用JDBC,认为开发人员专注于sql优化,MyBatis对于缓存依赖轻 MyBatis架构图 mybatis大体上分为三层: 第一层接口层,提供给开发人员用于操作的接口,要求mybatis操作数据库。(接口层不是真正实现的地方,只是用来与程序员做交互的)。 第二层 数据处理层:其中共有四个模块 1)参数映射:怎么将参数映射到相应的sql占位符上 2)sql解析:怎么将配置文件中的sql命令与当前的接口做关联 3)sql执行:判断是何种sql,完成sql调用 4)结果映射:利用反射机制将查询结果将某个实例做个相关的关联 支撑层:连接管理,事务,缓存等管理,配置信息的加载 大体执行流程 代码如下 public class Main { public static void main ( String [ ] args ) throws

mysql const与eq_ref的区别

北城以北 提交于 2020-01-14 02:36:42
简单地说是 const 是直接按主键或唯一键读取, eq_ref 用于联表查询的情况,按联表的主键或唯一键联合查询。 下面的内容翻译自 官方方档 : const 该表最多有一个匹配行, 在查询开始时读取。由于只有一行, 因此该行中列的值可以被优化器的其余部分视为常量。const 表非常快, 因为它们只读一次。 const 用于将 "主键" 或 "唯一" 索引的所有部分与常量值进行比较。在下面的查询中, tbl_name 可以用作 const 表: SELECT * FROM tbl_name WHERE primary_key=1; SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2; eq_ref 读取本表中和关联表表中的每行组合成的一行。除 了 system 和 const 类型之外, 这是最好的联接类型。当连接使用索引的所有部分时, 索引是主键或唯一非 NULL 索引时, 将使用该值。 eq_ref 可用于使用 = 运算符比较的索引列。比较值可以是常量或使用此表之前读取的表中的列的表达式。在下面的示例中, MySQL 可以使用 eq_ref 连接(join)ref_table来处理: SELECT * FROM ref_table,other_table WHERE ref

Mysql索引

僤鯓⒐⒋嵵緔 提交于 2020-01-14 02:20:09
1.什么是索引? 索引是帮助mysql高效获取数据的数据结构,mysql索引是B+树结构(B+树:非叶子节点不存储数据,只有叶子节点才存数据)。 索引的类型有:唯一索引,主键索引,组合索引(符合最左匹配原则)和普通索引。 2.索引的优缺点? 优点: 1.提高数据检索的效率,降低数据库IO成本。 2.对索引列进行排序,可以降低排序成本,降低CPU消耗。(order by 的字段是索引字段) 缺点: 1.索引会占据磁盘空间 2.增加了对表增删改操作的时间,在编辑数据库数据时还需要更新对应的索引数据。 3.索引的使用 操作索引: #新增 create index index_name on table ( column ) #修改表 增加索引 alter table table_name add index index_name ( column ) #新增唯一索引 create unique index index_name on table ( column ) #新增组合索引 alter table table_name add index idx_name_time ( name,time ) ; #删除索引 drop index index_name on table 查看表索引 show index from table_name 4.最左前缀原则 顾名思义,就是最左优先

MySQL 存储过程

老子叫甜甜 提交于 2020-01-14 01:54:36
我们常用的操作数据库语言SQL语 句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一 组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参 数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平 台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1).存储过程增强了SQL语 言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程 的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次 运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction

ORM PHP 学习记录

喜夏-厌秋 提交于 2020-01-14 01:44:12
ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。 举个例子:获取一篇文章,传统的方式先要执行一个sql检索数据 select * from post where id = 1 然后输出标题和内容使用 echo $post['title']; echo $post['content']; 上面的代码遇到面向对象强迫症者,他们会纠结死的。 所以他们想出了这个东西,在ORM里获取一篇文章可以这样: $post = postTable::getInstance()->find(1);#会再内部执行select * from post where id = 1 然后输出: echo $post->getTitle(); echo $post->getContent(); 妈妈再也不用担心我的强迫症了^_^ 高级点的应用,文章和分类是一对多关系、文章和标签是多对多关系 $cate = $post->getCategory(); //获取文章分类 echo $cate->getName(); //获取分类名 $tags = $post->getTags(); /

SQL语句 数据类型

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-14 01:43:21
6.1 Data Type 查看数据所占空间的两个函数: -- 查看所占字节数 select length('你好,世界') from dual; -- 查看所占字符数,即多少个字母,多少个汉字 select lengthb('您好,美女') from dual; -- 比如 create table aaa (a varchar2(6)); insert into aaa values ('aaa'); insert into aaa values ('你好'); select a, length(a), lengthb(a) from aaa; 6.1.1 字符类型 char,固定长度,默认1,最大2000,如果长度不够,用空格填充。 varchar2 类型,变长字符串,最多4000字节长度。 nvarchar2,跟上面比,增加了字符集的支持。 long,用于存储大数据,最多 2G。不建议使用,已被 clob 类型替代。 -- 它的使用跟 SQL 的标准 varchar 基本类似, -- 但是,在 Oracle 中请使用 varchar2 而不是 varchar, -- varchar2 的效率更高,并且在兼容性上做的更好 -- 初始化的语句为: name varchar2(20) -- 其中 20 代表最大长度, 默认单位是字节。 -- 如果定义为: name

mysql-CPU使用率高处理

微笑、不失礼 提交于 2020-01-13 19:34:34
1.通过show processlist;或show full processlist;命令查看当前执行的查询 2.杀掉该进程 mysql> kill 19 3.通过慢查询日志找到具体的sql语句 开启慢查询: [mysqld] slow_query_log=1 #开启慢查询 long_query_time=5 #慢查询时间 log-slow-queries = /var/log/mysql/slowquery.log #需有写入权限 4.使用explain 优化sql语句,参考:mysql使用explain优化sql语句 引起cpu过高的sql一般集中在order by、group by、批量insert、嵌套子查询等sql语句中 5.调整my.cnf的query_cache_size和tmp_table_size的值 来源: https://www.cnblogs.com/kylingx/p/12188730.html

mysql X00

爷,独闯天下 提交于 2020-01-13 18:22:01
alter 操作阻塞 在MySQL 5.5.3以后的版本中,未提交的事务一定会堵塞DDL请求(据说5.6.6以后的版本做了相关的优化,未做测试暂且不提) DDL在等待metada lock的过程中肯定会堵塞后续的DML请求,也有可能堵塞后续的SELECT请求(需要看SELECT请求是否能够命中qcache) 怎么处理这种问题是老生常谈了,优化SQL避免出现大事务,请求结束立即执行commit关闭事务,千万千万不要把所有的请求甚至包括代码的逻辑处理都塞在一个事务里面去完成,否则一旦出现一个DDL那就是灾难的发生,很难想象这次要是没有过载保护,XX系统是不会直接宕机呢? 这次问题的处理是这样的,线上环境彻底实施读写分离,让master只能写,因为这次的问题是因为程序员设定的读也使用了事务,度的频率明显高于写。 权限 授予权限 grant select,insert,update on `testdata`.* to qf@'172.100.102.%' identified by '123456'; flush privileges; 取消授权 revoke insert,update on `testdata`.* from qf@'172.100.102.%'; flush privileges; 备份账户的最小权限 select,lock tables 表的 crud

一个SQL update语句

假如想象 提交于 2020-01-13 16:33:47
须要每隔一段时间选取最老的商户更新时间戳: update DP_Shop set DP_Shop.LastDate = now() where DP_Shop.ShopId in (select ShopId from DP_Shop order by LastDate limit 5); ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 多加一层: update DP_Shop set DP_Shop.LastDate = now() where DP_Shop.ShopId in (select t.ShopId from (select ShopId from DP_Shop order by LastDate limit 5) as t); 能够work,但不高效。考虑下怎么优化。 最后是用暂时表: start transaction; create temporary table tmp1986 (select ShopId from DP_Shop order by LastDate limit 1000); update DP_Shop inner join tmp1986 on DP_Shop.ShopId =

数据库mysql_关系型数据库 & MySQL安装

允我心安 提交于 2020-01-13 15:29:46
文章目录 数据库mysql 一、 数据库简介 1.为什么需要数据库? 2.常见数据库有哪些? 3.数据库分类 (1)关系型数据库 (2)非关系型数据库 二、 关系型数据库 1.基本概念: (1)E-R模型 (2)范式理解 (3)范式判断 是否符合第一范式? 是否符合第二范式? 是否符合第三范式? 2.个人博客数据库设计 三、 MySQL简介与安装(linux) 1.MySQL常用存储引擎分析 2.MySQL安装 3.允许远程连接 四、 数据库操作 1.数据库操作 2.数据库表操作 查询操作* 查询的基本语法 消除重复行 条件 分组 对比where与having 排序 获取部分行 注意: 实际使用中,只是语句中某些部分的组合,而不是全部 五、 pymysql数据库编程 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库, 数据库mysql 一、 数据库简介 数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模