有三种格式,statement,row和mixed。
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。
索引的优点
索引的缺点
主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引
可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引
普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引
可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引
全文索引: 是目前搜索引擎使用的一种关键技术。
B 树& B+树两者有何异同呢?
第一种方式:在执行CREATE TABLE时创建索引
第二种方式:使用ALTER TABLE命令去增加索引
第三种方式:使用CREATE INDEX命令创建
根据索引名删除普通索引、唯一索引、全文索引:alter table 表名 drop KEY 索引名
删除主键索引:alter table 表名 drop primary key(需要取消自增长再行删除)
添加 PRIMARY KEY(主键索引)
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
Copy to clipboardErrorCopied
添加 UNIQUE(唯一索引)
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
Copy to clipboardErrorCopied
添加 INDEX(普通索引)
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
Copy to clipboardErrorCopied
添加 FULLTEXT(全文索引)
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
Copy to clipboardErrorCopied
添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
通常,通过索引查询数据比全表扫描要快。但是我们也必须注意到它的代价。
索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改。 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O。 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。
主键索引
二级索引(辅助索引)
二级索引又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。
唯一索引,普通索引,前缀索引等索引属于二级索引。
何时使用聚簇索引与非聚簇索引
不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询。
举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。
不可重复读和幻读区别:
为了达到事务的四大特性,数据库定义了4种不同的事务隔离级别,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别
InnoDB 存储引擎在 分布式事务 的情况下一般会用到SERIALIZABLE(可串行化)隔离级别。
在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突
在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。
行级锁
行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。
特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
表级锁
表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
页级锁
页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
InnoDB是基于索引来完成行锁
例: select * from tab_with_index where id = 1 for update;
for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列,如果 id 不是索引键那么InnoDB将完成表锁,并发将无从谈起
MyISAM 和 InnoDB 存储引擎使用的锁:
表级锁和行级锁对比:
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
常见的解决死锁的方法
1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;
悲观锁
乐观锁
两种锁的使用场景
从上面对两种锁的介绍,我们知道两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。
但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。
优点
1)存储过程是预编译过的,执行效率高。
2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
3)安全性高,执行存储过程需要有一定权限的用户。
4)存储过程可以重复使用,减少数据库开发人员的工作量。
缺点
1)调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2)移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3)重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4)如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
1、什么是视图?
视图是将一段查询sql封装为一个虚拟的表,这个虚拟表只会保存sql逻辑,不会保存任何查询结果,也不会占据空间,所以每次进行查询时都是重新执行sql。可以将视图理解为一个函数,想要调用时直接调用即可
2、视图的作用
①封装复杂sql,提高复用性
②对数据库重构,而不影响程序的运行
③只会展现视图结果中的数据,而不会展现引用表中的数据,提高了数据安全性
3、视图的缺点?
①性能不佳,每次执行视图都会重新执行语句
②修改限制,需要对数据进行修改时,必须把视图转化为基本表进行修改,但是对于复杂的视图,可能是不可修改的
使用场景
多版本并发控制(MVCC) 是通过保存数据在某个时间点的快照来实现并发控制的。也就是说,不管事务执行多长时间,事务内部看到的数据是不受其它事务影响的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。
简单来说,多版本并发控制 的思想就是保存数据的历史版本,通过对数据行的多个版本管理来实现数据库的并发控制。这样我们就可以通过比较版本号决定数据是否显示出来,读取数据的时候不需要加锁也可以保证事务的隔离效果。
可以认为 多版本并发控制(MVCC) 是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。
1. 读写之间阻塞的问题
2. 降低了死锁的概率
3. 解决一致性读的问题
快照读(SnapShot Read) 是一种一致性不加锁的读,是InnoDB并发如此之高的核心原因之一。
这里的一致性是指,事务读取到的数据,要么是事务开始前就已经存在的数据,要么是事务自身插入或者修改过的数据。
不加锁的简单的 SELECT 都属于快照读
SELECT * FROM t WHERE id=1
当前读就是读取最新数据,而不是历史版本的数据。加锁的 SELECT 就属于当前读,例如:
SELECT * FROM t WHERE id=1 LOCK IN SHARE MODE;
SELECT * FROM t WHERE id=1 FOR UPDATE;
事务版本号
行记录的隐藏列
InnoDB 的叶子段存储了数据页,数据页中保存了行记录,而在行记录中有一些重要的隐藏字段:
DB_ROW_ID:6-byte,隐藏的行 ID,用来生成默认聚簇索引。如果我们创建数据表的时候没有指定聚簇索引,这时 InnoDB 就会用这个隐藏 ID 来创建聚集索引。采用聚簇索引的方式可以提升数据的查找效率。
DB_TRX_ID:6-byte,操作这个数据的事务 ID,也就是最后一个对该数据进行插入或更新的事务 ID。
DB_ROLL_PTR:7-byte,回滚指针,也就是指向这个记录的 Undo Log 信息。
Read View
Read View 决定了记录是否对本事务可见。包含以下:
low_limit_id(高水位)
up_limit_id(低水位)
trx_ids
low_limit_no
creator_trx_id
Undo Log
可见性比较算法
对于当前事务的启动瞬间来说,一个数据版本的 row trx_id,有以下几种可能:
如果落在绿色部分,表示这个版本是已提交的事务或者是当前事务自己生成的,这个数据是可见的;
如果落在红色部分,表示这个版本是由将来启动的事务生成的,是肯定不可见的;
如果落在黄色部分,那就包括两种情况
一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:
隔离级别不同,Read View机制也不同
索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。
索引下推在非主键索引上的优化,可以有效减少回表的次数,大大提升了查询的效率。
在多个条件查询中(一般在普通索引中使用),使用索引下推不会忽略其他条件,在本次查询中就过滤出来,无需再回表进行其他条件的判断,可以有效减少回表的次数,大大提升了查询的效率。
如有(name, age)索引时:查询name like ‘陈%’ and age > 20
如果不使用索引下推:将满足name like '陈%'的所有记录返回,再根据age的条件进行第二次回表查询
如果使用了索引下推:在判断name like '陈%'后,并没有忽略age字段,在索引内部将不满足age条件的记录直接跳过,此时就无需回表二次查询。
# 关闭索引下推
set optimizer_switch='index_condition_pushdown=off';
实现悲观锁利用select … for update加锁, 操作完成后使用commit来释放锁;
innodb引擎时, 默认行级锁, 当有明确字段时会锁一行, 如无查询条件或条件;字段不明确时, 会锁整个表,条件为范围时会锁整个表;
查不到数据时, 则不会锁表。
文章浏览阅读8.6k次。由于做研究需要,学习了一下matlab的知识。在学习过程当中也出现过问题,也学会一些办法来解决这些问题。在这里做一下笔记,来记录matlab神经网络学习过程。以下内容中还有很多是从网上借鉴而来,权当学习。1.什么是神经网络比较粗浅的解释是,我们把输入信号当做matlab中需要输入的数据,将这些数据输入到神经网路后,这些数据都会乘以个数,即权值w,得出的结果再与阈值b相加后求和得到u,为了能_matlab神经网络进行多轮学习
文章浏览阅读2.8k次。身份验证错误,指定的句柄无效猜测可能是因为以前保存的凭据出错,并且新输入的密码没能正确保存的缘故。试试看这样做:1,打开开始菜单,点击右上角的用户帐户图片2,点击左侧的“管理您的凭据”链接3,在“Windows凭据”类别下,应该会列出一些内容,找到并删除“TERMSRV/xxx”,其中“xxx”是目标机器的机器名或IP地址4,重新尝试连接转载:解决方法..._发生身份验证错误,指定的句柄无效
文章浏览阅读1.9w次,点赞10次,收藏19次。矩阵的秩秩其实就是刻画了:秩就是线性无关列(行)向量的最大数目。一个重要的结论是:行秩等于列秩。设AAA是一个m×nm \times nm×n 的矩阵,其列秩为 rrr . 因此AAA的列空间的维度是rrr . 令 c1,c2,…,crc_{1},c_{2}, \ldots ,c_{r}c1,c2,…,cr 是 AAA 的列空间的一组基,构成 m×rm\times rm×r 矩阵 C..._行秩等于列秩等于矩阵的秩
文章浏览阅读1.8w次,点赞4次,收藏22次。hbase hbck新版本的 hbck 可以修复各种错误,修复选项是: (1)-fix,向下兼容用,被-fixAssignments替代 (2)-fixAssignments,用于修复region assignments错误 (3)-fixMeta,用于修复meta表的问题,前提是HDFS上面的region info信息有并且正确。 (4)-fixHdfsHoles,修_hbase 修复
文章浏览阅读415次。关注微信公共号:小程在线关注程序员宅基地:程志伟的博客1.加载包(@v1.4) pkg> add LIBSVM Updating registry at `C:\Users\cheng\.julia\registries\General` Updating git-repo `https://github.com/JuliaRegistries/General.git` Resolving package versions... Installed MbedTLS...
文章浏览阅读1.8k次。 Docker运行参数详解 docker search 参数: MacdeMacBook-Pro:~ mac$ docker network create --helpUsage: docker network create [OPTIONS] NETWORKCreate a networkOptions: --attachable ..._docker ipam-driver 取值
文章浏览阅读1.5k次,点赞43次,收藏41次。首先搞明白什么是苹果激活锁有叫id锁,一定要把他和屏幕锁区别开来,屏幕锁就是让输入四位,六位,或者更多符号的,密码锁,这个经常使用智能手机的用户都只能,苹果的手机和安卓的有很大不同,安卓机有设置图形锁,苹果的没有这个图形锁,激活id锁很多时候是屏幕锁忘记了,刷机以后出现的的,很多人设置了屏幕锁忘记了,输入多次出现iPhone 已停用,需要连接iTunes ,这个情况下就需要连接电脑上用iTunes 刷机才可以._苹果手机怎么用序列号解id解锁
文章浏览阅读7.2k次,点赞9次,收藏30次。解决方法:把所有配置文件的编码格式由UTF-8全部改为UTF8 ,喜欢技术的,一起进群交流学习吧!!!_error building sqlsession.
文章浏览阅读5k次。(5)安装成功后自动跳转工具箱UDID page,显示UDID number,可发送至email。(2)打开iTunes(现在中文名叫"音乐"),点击顶部那一栏的信息,可以切换看到不同的信息。下的iPhone,点击顶部那一栏的序列号信息,可以切换看到不同的信息,找到UDID。(4)提示正在尝试下载一个配置描述文件(允许),设置里安装蒲公英描述文件。(3)选中自己的手机,就能看到信息,"Identifier"= UDID。(2)ios手机右上角下拉,选择扫一扫,扫描二维码。(1)usb,手机连接电脑后。_udid获取
文章浏览阅读354次。本题在牛客网剑指offer专项里没看到,原书第二版上有,如题:这道题是开放的动态规划题,题目中只给了绳子长度,却没定义具体剪多少段,初遇此题,难以下手,看了题解,豁然开朗。设f(n)为常为n的绳子剪成m段之后可得最大值,则存在n-1中减法,得f(n) = MAX(f(i) * f(n-i));初始值f(1),f(2),f(3)都可以计算出来,大于3则调用dp方程递归计算至n即可。思路简..._c++剪绳子
文章浏览阅读667次。python可以自学。任何一门编程语言都可以自学。如果是零基础的同学,学起来可能要吃力,而且在学习过程中找不到成就感,很容易打击自信心,所以要自学一定要找对方法。下面小编就为大家介绍一下自学python的方法。自学python的方法第一、学习Python,自学或者跟老师学都可以,得看个人的学习方式和方法,重点是要坚持下去,不然都是空话!第二、确定自己的学习方向。避免走弯路,选一个自己的目标方向。第..._python自学行吗
文章浏览阅读1.1w次。2#include #include #define SIZE 101 using namespace std; int a[SIZE][SIZE]; /* 最Á?大ä¨子Á¨段?和¨ª */int MaxSubArray(int n, int* a){ int max = 0; int b = 0; for (int i = 0; i < n;_代码:sourl.cn/dwdmqp