数据库主键

一文总结分析聚集索引、非聚集索引、覆盖索引的工作原理!

旧街凉风 提交于 2020-04-07 22:47:24
「 数据库 」和「 数据库索引 」这两个东西是在服务器端开发领域应用最为广泛的两个概念,熟练使用数据库和数据库索引是开发人员在行业内生存的必备技能。 使用索引很简单,只要能写创建表的语句,就肯定能写创建索引的语句,要知道这个世界上是不存在不会创建表的服务器端程序员的。然而, 会使用索引是一回事, 而深入理解索引原理又能恰到好处使用索引又是另一回事,这完全是两个天差地别的境界(我自己也还没有达到这层境界)。很大一部份程序员对索引的了解仅限于到“加索引能使查询变快”这个概念为止。 1、为什么要给表加上主键? 2、为什么加索引后会使查询变快? 3、为什么加索引后会使写入、修改、删除变慢? 4、什么情况下要同时在两个字段上建索引? 这些问题他们可能不一定能说出答案。知道这些问题的答案有什么好处呢?如果开发的应用使用的数据库表中只有1万条数据,那么了解与不了解真的没有差别, 然而, 如果开发的应用有几百上千万甚至亿级别的数据,那么不深入了解索引的原理, 写出来程序就根本跑不动,就好比如果给货车装个轿车的引擎,这货车还能拉的动货吗? 接下来就讲解一下上面提出的几个问题,希望对阅读者有帮助。 网上很多讲解索引的文章对索引的描述是这样的「索引就像书的目录, 通过书的目录就准确的定位到了书籍具体的内容」,这句话描述的非常正确, 但就像脱了裤子放屁,说了跟没说一样

MyISAM与InnoDB两者之间怎么选择

痴心易碎 提交于 2020-04-06 09:21:47
1、MyISAM不支持事务,InnoDB是事务类型的存储引擎 当我们的表需要用到事务支持的时候,那肯定是不能选择MyISAM了。 2、MyISAM只支持表级锁,BDB支持页级锁和表级锁默认为页级锁,而InnoDB支持行级锁和表级锁默认为行级锁 表级锁:直接锁定整张表,在锁定期间,其他进程无法对该表进行写操作,如果设置的是写锁,那么其他进程读也不允许 MyISAM是表级锁定的存储引擎,它不会出现死锁问题 对于write,表锁定原理如下: 如果表上没有锁,在其上面放置一个写锁,否则,把锁定请求放在写锁队列中。 对于read,表锁定原理如下 : 如果表上没有写锁定,那么把一个读锁放在其上面,否则把锁请求放在读锁定队列中 当一个锁定被释放时,表可被写锁定队列中的线程得到,然后才是读锁定队列中的线程。这意味着,如果你在一个表上有许多更新,那么你的SELECT语句将等到所有的写锁定线程执行完。 行级锁:只对指定的行进行锁定,其他进程还是可以对表中的其他行进行操作的。 行级锁是Mysql粒度最小的一种锁,它能大大的减少数据库操作的冲突,但是粒度越小实现成本也越大。 行 级锁可能会导致“死锁”,那到底是怎么导致的呢,分析原因:Mysql行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条 sql语句操作了主键索引,那么Mysql就会锁定这个主键索引

MyISAM与InnoDB两者之间怎么选择

六月ゝ 毕业季﹏ 提交于 2020-04-06 09:21:30
MyISAM与InnoDB两者之间怎么选择 1、MyISAM不支持事务,InnoDB是事务类型的存储引擎 当我们的表需要用到事务支持的时候,那肯定是不能选择MyISAM了。 2、MyISAM只支持表级锁,BDB支持页级锁和表级锁默认为页级锁,而InnoDB支持行级锁和表级锁默认为行级锁 表级锁:直接锁定整张表,在锁定期间,其他进程无法对该表进行写操作,如果设置的是写锁,那么其他进程读也不允许 MyISAM是表级锁定的存储引擎,它不会出现死锁问题 对于write,表锁定原理如下: 如果表上没有锁,在其上面放置一个写锁,否则,把锁定请求放在写锁队列中。 对于read,表锁定原理如下 : 如果表上没有写锁定,那么把一个读锁放在其上面,否则把锁请求放在读锁定队列中 当一个锁定被释放时,表可被写锁定队列中的线程得到,然后才是读锁定队列中的线程。这意味着,如果你在一个表上有许多更新,那么你的SELECT语句将等到所有的写锁定 线程执行完。 行级锁:只对指定的行进行锁定,其他进程还是可以对表中的其他行进行操作的。 行级锁是Mysql粒度最小的一种锁,它能大大的减少数据库操作的冲突,但是粒度越小实现成本也越大。 行级锁可能会导致“死锁”,那到底是怎么导致的呢,分析原因:Mysql行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主 键索引

T- SQL性能优化详解 http://www.cnblogs.com/weixing/p/3357519.html

让人想犯罪 __ 提交于 2020-04-03 21:48:14
T- SQL性能优化详解 http://www.cnblogs.com/weixing/p/3357519.html 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因。   经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表甚至有上千万行数据,测试团队开始在生产数据库上测试,发现订单提交过程需要花5分钟时间,但在网站上线前的测试中,提交一次订单只需要2/3秒。   类似这种故事在世界各个角落每天都会上演,几乎每个开发人员在其开发生涯中都会遇到这种事情,我也曾多次遇到这种情况,因此我希望将我解决这种问题的经验和大家分享。   如果你正身处这种项目,逃避不是办法,只有勇敢地去面对现实。首先,我认为你的应用程序中一定没有写数据访问程序,我将在这个系列的文章中介绍如何编写最佳的数据访问程序,以及如何优化现有的数据访问程序。    范围   在正式开始之前,有必要澄清一下本系列文章的写作边界,我想谈的是“事务性(OLTP)SQL Server数据库中的数据访问性能优化”,但文中介绍的这些技巧也可以用于其它数据库平台。  

Mysql实战45讲----为什么学习mysql

你。 提交于 2020-04-01 12:30:25
  即使是一个开发工程师,也只是 MySQL 的用户,但在了解了一个个系统模块的原理后,再来使用它,感觉是完全不一样的。   当在代码里写下一行数据库命令的时候,就能想到它在数据库端将怎么执行,它的性能是怎么样的,怎样写能让应用程序访问数据库的性能最高。进一步,哪些数据处理让数据库系统来做性能会更好,哪些数据处理在缓存里做性能会更好,心里也会更清楚。在建表和建索引的时候,我也会更有意识地为将来的查询优化做综合考虑,比如确定是否使用递增主键、主键的列怎样选择,等等。   所以需要系统的学习mysql,形成学习网络而不是只知道零散的知识点。可能一个业务开发人员用了两三年 MySQL,还未必清楚那些自己一直在用的“最佳实践”为什么是最佳的。   看完这些需要输出自己的mysql知识网络。    来源: https://www.cnblogs.com/lvzhenhua/p/12610213.html

sql_基础学习_关系模型_主键,外键,索引

99封情书 提交于 2020-03-29 13:36:11
关系数据库是建立在关系模型上的。而关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Excel表。 表的每一行称为记录(Record),记录是一个逻辑意义上的数据。 表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。 字段定义了数据类型(整型、浮点型、字符串、日期等),以及是否允许为 NULL 。注意 NULL 表示字段数据不存在。一个整型字段如果为 NULL 不表示它的值为 0 ,同样的,一个字符串型字段为 NULL 也不表示它的值为空串 '' 。——NULL是不可以和0以及' '比较的。 关系数据库的表和表之间需要建立“一对多”,“多对一”和“一对一”的关系,这样才能够按照应用程序的逻辑来组织和存储数据。 在关系数据库中,关系是通过主键和外键来维护的。 1,主键: 能够通过某个字段唯一区分出不同的记录,这个字段被称为主键; 在关系数据库中,一张表中的每一行数据被称为一条记录。一条记录就是由多个字段组成的。每一条记录都包含若干定义好的字段。同一个表的所有记录都有相同的字段定义。 关系表约束:任意两条记录不能重复; 主键要求:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响; 选取主键基本原则:不使用任何业务相关的字段作为主键; 作为主键最好是完全业务无关的字段,我们一般把这个字段命名为 id

all index range ref eq_ref const system 索引type说明

こ雲淡風輕ζ 提交于 2020-03-28 23:19:57
背景知识 在使用sql的过程中经常需要建立索引,而每种索引是怎么处罚的又是怎么起到作用的,首先必须知道索引和索引的类型。 索引类型 type 我们可以清楚的看到 type 那一栏有 index ALL eq_ref ,他们都代表什么意思呢? 首先类型有许多,这里我只给大家介绍用的最多的 几种 类型: system>const>eq_ref>ref>range>index>ALL 越往左边,性能越高, 比如 system 就比 ALL 类型性能要高出许多 ,其中 system 、 const 只是理想类型,基本达不到; 我们自己实际能优化到 ref>range 这两个类型,就是你自己写 SQL ,如果你没优化基本上就是 ALL ,如果你优化了,那就尽量达到 ref>range 这两个级别; 左边基本达不到! 所以,要对 type 优化的前提是, 你需要有索引,如果你连索引都没有创建,那你就不用优化了,肯定是 ALL..... ; Type 级别详解 一 .system 级别 索引类型能是 system 的只有两种情况: 1. 只有一条数据的系统表 只有一条数据的系统表,就是系统里自带一张表,并且这个表就一条数据,这个基本上就达不到,这个是系统自带的表,而且就一条数据,所以基本达不到; 2. 或衍生表只能有一条数据的主查询 这个是可以实现的,但是在实际开发当中

MySQL索引查询原理

烂漫一生 提交于 2020-03-28 00:02:14
什么是索引? “索引”是为了能够更快地查询数据。比如一本书的目录,就是这本书的内容的索引,读者可以通过在目录中快速查找自己想要的内容,然后根据页码去找到具体的章节。 数据库也是一样,如果查询语句使用到了索引,会先去索引里面查询,取得数据所在行的物理地址,进而访问数据。 索引的优缺点 优势:以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序; 劣势:索引本身也是表,因此会占用存储空间。索引的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表。 索引的分类 在MySQL中,常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引。创建语法分别为: 其中,组合索引又称为多列索引,上述代码中最后一个例子就是建立了3列的索引。MySQL在根据索引查询时,会遵循“最左匹配”原则,即先根据col1的条件查,再根据col2的条件查,然后再根据col3的条件去查。 如果跳过了一个列直接查后面的列,比如下面的语句,就不能使用上面创建的索引了: 这里有一个小技巧,如果你前面的列是一个简单的枚举类型,比如性别等,可以用在where语句中加 col1 in(MALE, FEMALE) 来“跳过” col1 列,并使用上述索引。 对于某列如果是字符串且比较长(比如UUID

主键与索引

为君一笑 提交于 2020-03-25 12:26:20
3 月,跳不动了?>>> 唯一索引 :该字段没有重复值,但允许空值(该字段可以有多个null值) ,一张table只允许一个主键,但可以创建多个unique index 函数索引: 如果在我们的查询条件使用了函数,那么索引就不可用了。可以用建立函数索引的方式,来解决这个问题   例如:    select * from product where nvl(price,0.0)>1000.0 ;    这里,nvl(price,0.0)使用了函数,索引不能利用price字段上做的索引了   我们来创建函数索引    create index index_price on product(nvl(price,0.0)); 其他: 1. 创建表时,不能在同一个字段上建立两个索引(主键默认建立唯一索引) 。 2. 唯一索引能极大的提高查询速度,而且还有唯一约束的作用。一般索引,只能提高30%左右的速度 经常插入,修改,应在查询允许的情况下,尽量减少索引,因为添加索引,插入,修改等操作,需要更多的时间 3. 主键一定是唯一性索引,唯一性索引并不一定就是主键。 4. 一个表中可以有多个唯一性索引,但只能有一个主键。 5. 主键列不允许空值,而唯一性索引列允许空值。 主键和索引都是键,不过主键是逻辑键,索引是物理键,意思就是主键不实际存在,而索引实际存在在数据库中 来源: oschina 链接:

Hibernate 的主键生成策略

百般思念 提交于 2020-03-25 11:00:32
原文链接: http://www.yiidian.com/hibernate/hibernate-generator.html Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制。 1 生成策略配置格式 用户User的实体类User.java package com.yiidian.domain; import java.util.Date; public class User { private String id; private String name; public User(){} public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } User.java对应的映射文件User.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate