sql优化

MySQL之行锁

心已入冬 提交于 2020-01-15 23:19:55
前言   本章介绍行锁的相关知识。 行锁 偏向 InnoDB 存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高。 准备   1. 创建表tb_innodb_lock,注意数据库引擎为 InnoDB 。 CREATE TABLE test_innodb_lock ( a INT (11), b VARCHAR (20) ) ENGINE INNODB DEFAULT charset = utf8; insert into test_innodb_lock values (1,'a'); insert into test_innodb_lock values (2,'b'); insert into test_innodb_lock values (3,'c'); insert into test_innodb_lock values (4,'d'); insert into test_innodb_lock values (5,'e');    2.创建索引。 create index idx_lock_a on test_innodb_lock(a); create index idx_lock_a on test_innodb_lock(b); 1.行锁定基本演示 1.打开A、B另个会话,并关闭数据库的自动提交。 set autocommit=0;

SQL Server中约束的介绍

孤人 提交于 2020-01-15 19:45:49
摘要 对于SQL Server中的约束,想必大家并不是很陌生。但是约束中真正的内涵是什么,并不是很多人都很清楚的。本文以详细的文字来介绍了什么是约束,以及如何在数据库编程中应用和使用这些约束,来达到更好的编程效果。 (本文部分内容参考了SQL Server联机手册) 内容 数据完整性分类 实体完整性 域完整性 引用完整性 用户定义完整性 PRIMARY KEY 约束 DEFAULT 约束 CHECK 约束 UNIQUE 约束 FOREIGN KEY 约束 正文 在数据库管理系统中,保证数据库中的数据完整性是非常重要的。所谓数据完整性,就是指存储在数据库中数据的一致性和正确性。约束定义关于列中允许值的规则,是强制完整性的标准机制。使用约束优先于使用触发器、规则和默认值。查询优化器也使用约束定义生成高性能的查询执行计划。 SQL Server联机丛书中,将数据完整性解释如下:“ 存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。 ”强制数据完整性可确保数据库中的数据质量。 例如,如果输入了 employee_id 值为 123 的职员,那么该数据库不应允许其他职员使用同一 ID 值。如果计划将 employee_rating 列的值范围设定为从 1 到 5,则数据库不应接受 6。如果表有一 dept_id 列

MyBatis 笔记

安稳与你 提交于 2020-01-15 14:03:49
官方文档: 英文: https://mybatis.org/mybatis-3/ 中文: https://mybatis.org/mybatis-3/zh/index.html MyBatis概述 什么是MyBatis MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。 MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。 MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录 Mybatis与其他持久化方式对比 MyBatis是一个半自动化的持久化框架 JDBC是SQL夹在Java代码中,耦合度高导致硬编码,维护不易且实际开发中SQL会经常变化 Hibernate和JPA是内部自动产生的SQL语句,不容易做特殊优化,长而复杂的SQL,hibernate处理也不容易,是基于全映射的全自动化框架,大量子弹的pojo进行部分映射比较困难,导致数据库性能下降 对于开发人员,核心SQL需要自己优化,所以需要SQL和java编码分开,功能界面明显,一个专注业务,一个专注数据 文档资料 下载地址:https://github.com/mybatis/mybatis-3 中文文档:http://www.mybatis.org

MySQL数据库索引详解

蓝咒 提交于 2020-01-15 13:04:20
一、什么是索引:   索引是一个排序的列表,在这个列表中存储着索引值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询速度,这是因为使用索引后可以不用全表扫描来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。   索引通过不断缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机事件变成顺序事件,也就是说,有个这个机制我们可以总是用同一种查找方式来锁定数据;   索引实际就是一张表,该表保存了主键和索引字段,并指向实体表的记录,所以索引也是占了一大部分空间,不可能存储在内存中,因此索引往往都是以文件形式存储在我们的硬盘上。 二、索引的分类: 常见索引有主键索引、唯一索引、普通索引、全文索引和组合索引。 1、主键索引 主索引,根据pk_clolum(length)建立索引,不允许重复,不允许空值; ALTER TABLE 'table_name' ADD PRIMARY KEY pk_index('col'); 2、唯一索引 用来建立索引的列的值必须是唯一的,允许空值; ALTER TABLE ‘table_name' ADD UNIQUE index_name('col'); 3、普通索引 用表中的普通列构建的索引,没有任何限制; ALTER TABLE 'table_name' ADD INDEX index_name(

MySQL快速回顾:高级查询操作

牧云@^-^@ 提交于 2020-01-15 11:32:55
8.1 排序数据 检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能依赖该排序顺序。 关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。 子句的解释: 一个子句通常由一个关键字和所提供的数据组成 。SQL语句由子句构成,有些子句是必需的,而有些是可选的。 为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。排序顺序有两种:升序(ASC关键字)和降序(DESC关键字), 格式: # 升序(默认不写就是升序) SELECT field1,field2,... FROM <table_name> ORDER BY field1,field2,...; SELECT field1,field2,... FROM <table_name> ORDER BY field1,field2,... ; # 降序 SELECT field1,field2,... FROM <table_name> ORDER BY field1,field2,... DESC; # 对field1降序

CentOS7.5使用mysql_multi方式安装MySQL5.7.28多实例

你。 提交于 2020-01-15 10:53:40
因使用源码安装的MySQL5.7.28多实例,在导入数据库时会出现问题,所以重新研究使用mysql_multi的方法来管理多实例,经过测试环境验证之后,在各方面使用上特别在备份还原上,没有报MySQL5.7.28多实例的问题,踩了不少坑,这里我将我的部署过程分享下,如果在哪里出问题的,还请多多指正与指导,谢谢!! 关于mysql安装部署基础环境与配置可以参考文章:CentOS7.5源码安装MySQL5.7.28多实例 https://blog.51cto.com/8355320/2463218 本从就直接从2.7章节开始安装mysql多实例,具体部署过程如下: 2.7 安装mysql多实例 2.7.1. 创建软件安装目录(部署路径请根据实际修改) [root@~]# mkdir -pv /data/mysql/{3306,3307} [root@~]# mkdir -v /data/mysql/3306/{logs,data,binlog} [root@~]# mkdir -v /data/mysql/3307/{logs,data,binlog} 2.7.2. MySQL安装包下载 [root@~]# cd /opt [root@~]# wget -c https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-linux

MySQL的存储原理和过程

五迷三道 提交于 2020-01-15 09:03:25
Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命令,需要使用的时候拿出来用就可以了。想要快速的了解Mysql储存过程吗,就一同看一下下文的“Mysql储存过程-原理、语法、函数详细说明”吧! 一、Mysql储存过程简介: 储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。存储过程通常有以下优点: 1)存储过程能实现较快的执行速度。 如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 心得:编译优化,快! 2)存储过程允许标准组件是编程。 存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句

SQL Server游标的使用【转】

十年热恋 提交于 2020-01-15 08:51:11
SQL Server游标的使用【转】 Posted on 2011-11-26 00:33 moss_tan_jun 阅读( 206754) 评论( 53) 编辑 收藏 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合的。而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服。 正常面向集合的思维方式是: 而对于游标来说: 这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量…… 从游标对数据库的读取方式来说,不难看出游标为什么占用更多的资源,打个比方: 当你从ATM取钱的时候,是一次取1000效率更高呢,还是取10次100? 既然游标这么“邪恶”,为什么还要学习游标 我个人认为存在既是合理.归结来说,学习游标原因我归纳为以下2点 1.现存系统有一些游标,我们查询必须通过游标来实现 2.作为一个备用方式,当我们穷尽了while循环,子查询,临时表,表变量,自建函数或其他方式扔来无法实现某些查询的时候,使用游标实现. T-SQL中游标的生命周期以及实现 在T-SQL中,游标的生命周期由5部分组成 1.定义一个游标 在T-SQL中,定义一个游标可以是非常简单,也可以相对复杂,取决于游标的参数

MySQL优化排名语句

廉价感情. 提交于 2020-01-15 08:28:04
先捋下变量的使用基本规则 在给一个变量赋值的同时使用这个值: set @rownum:=0; select actor_id,@rownum:=@rownum+1 as rownum from actor limit 10; 使用自定义变量对结果进行排名: set @film_num:=0; select *,@film_num:=@film_num+1 as num from( select actor_id,count(*) as cnt from film_actor GROUP BY actor_id ORDER BY cnt DESC limit 10)t 来源: CSDN 作者: 学亮编程手记 链接: https://blog.csdn.net/a772304419/article/details/103952999

面试题:Mysql数据库对varchar类型字段用int进行查询问题

倖福魔咒の 提交于 2020-01-15 07:33:12
表数据是这样: CREATE TABLE `t_test` ( `id` int(11) NOT NULL, `no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of t_test -- ---------------------------- INSERT INTO `t_test` VALUES (1, '1', '张三'); INSERT INTO `t_test` VALUES (2, '1a', '李四'); INSERT INTO `t_test` VALUES (3, '1aa', '王五'); INSERT INTO `t_test` VALUES (4, 'bb', 'aaa'); INSERT