数据库主键

[MySQL] MySQL索引原理及优化

拥有回忆 提交于 2019-11-26 14:22:31
一 索引的本质   MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质: 索引是数据结构 。   数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。   最基本的查询算法当然是 顺序查找 (linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如 二分查找 (binary search)、 二叉树查找 (binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于 二叉查找树 上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织)。   所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。      图片展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找

数据库能插入一条记录但是不能插入第二条([Err] 1062 - Duplicate entry '0' for key 'PRIMARY')

爱⌒轻易说出口 提交于 2019-11-26 14:20:42
数据库能插入一条记录但是不能插入第二条 今天小谷在做微信小程序时,跑一个插入功能报了如下错: [Err] 1062 - Duplicate entry '0' for key 'PRIMARY' 后来我发现,数据库中只能插入一条数据,当出入第二条数据的时候就报错。 检查发现是主键没有设置自动增长,而且我插入的时候忽略的主键(id)。 修改字段自增: alter table 表名 change id id int not null auto_increment ; 修改主键 alter table 表名 add primary key(id); 来源: CSDN 作者: 谷咕咕 链接: https://blog.csdn.net/a1424261303/article/details/89101603

数据库插入数据返回当前主键ID值方法随记

南楼画角 提交于 2019-11-26 14:10:28
当我们插入一条数据的时候,我们很多时候都想立刻获取当前插入的主键值返回以做它用。我们通常的做法有如下几种: 1. 先 select max(id) +1 ,然后将+1后的值作为主键插入数据库; 2. 使用特定数据库的 auto_increment 特性,在插入数据完成后,使用 select max(id) 获取主键值; 3. 对于Oracle,使用 sequence 获取值。 对于以上3种方法都无法绝对保证在高并发情况下的操作的原子性。 现记录以下几种获取数据库主键值方法: 1. 数据库原生支持的sql方法: SQLServer: [color=cyan] Oracle: [/color] 2. java.sql.Statement 返回键获取: a: 使用JDBC 3.0提供的 getGeneratedKeys (推荐使用) b:使用特定数据库特有的SQL 来源: CSDN 作者: gyhui881111 链接: https://blog.csdn.net/GYHui881111/article/details/84012729

Mysql优化部分总结

随声附和 提交于 2019-11-26 14:02:45
1. 存储引擎的选择 存储引擎:MySQL中的数据、索引以及其他对象的存储方式 5.1之前默认存储引擎是MyISAM,5.1之后默认存储引擎是Innodb。 差异: 区别 MyISAM Innodb 文件格式 数据和索引是分别存储的,数据.MYD,索引.MYI 数据和索引是集中存储的.ibd 文件能否移动 能,一张表就对应.frm,MYD,MYI 3个文件 不能,关联的还有data下其他文件 记录存储顺序 按记录插入顺序保存 按主键大小有序插入 空间碎片 产生;定时清理,使用命令optimize table表名实现 不产生 事务 不支持 支持 外键 不支持 支持 锁颗粒 表级锁 行级锁 MyISAM引擎设计简单,数据以紧密格式存储,所以某些读取场景下性能很好。 如果没有特别的需求,使用默认的Innodb即可。 MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。 Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键保证数据完整性。比如OA自动化办公系统。 《高性能Mysql》一书中列举很多存储引擎,但是其强烈推荐使用Innodb即可 2. 字段设计 - 数据库设计3大范式 第一范式(确保每列保持原子性) 第二范式(确保表中的每列都和主键相关) 第三范式(确保每列都和主键列直接相关,而不是间接相关) 通常建议使用范式化设计

数据库设计60个技巧

为君一笑 提交于 2019-11-26 12:47:01
数据库设计指南 如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲。所以我们最近找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。我们的编辑从收到的130 个反馈中精选了其中的60 个最佳技巧,并把这些技巧编写成了本文,为了方便索引其内容划分为5 个部分: 第1 部分— 设计数据库之前 这一部分罗列了12 个基本技巧,包括命名规范和明确业务需求等。 第2 部分— 设计数据库表 总共24 个指南性技巧,涵盖表内字段设计以及应该避免的常见问题等。 第3 部分— 选择键 怎么选择键呢?这里有10 个技巧专门涉及系统生成的主键的正确用法,还有何时以及如何索引字段以获得最佳性能等。 第 4 部分 — 保证数据完整性 讨论如何保持数据库的清晰和健壮,如何把有害数据降低到最小程度。 第5 部分— 各种小技巧 不包括在以上4 个部分中的其他技巧,五花八门,有 了它们希望你的数据库开发工作会更轻松一些。 第1 部分— 设计数据库之前 考察现有环境 在设计一个新数据库时,你不但应该仔细研究业务需求而且还要考察现有的系统。大多数数据库项目都不是从头开始建立的;通常,机构内总会存在用来满足特定需求的现有系统(可能没有实现自动计算)。显然

创建数据库与表

懵懂的女人 提交于 2019-11-26 11:50:56
设置索引 存为sql,仅结构 先看有没有player删除,反引号是为了与保留字区分 player_name 字符utf8 ,排序规则utf_general_ci,大小写不敏感,敏感的为utf8_bin,采用unique,也可以设置为normal,索引方式可以设置为btree或者hash 引擎为InnoDB 字符集 排序 ROW_FORMAT行格式为Dynamic 常见约束 主键 外键 唯一性 NOT NULL DEFAULT CHECK 设计原则 更少的表,更少的字段,更少的联合主键,多增加主键与外键增强表之间的复用率,可重用 如果正确性>性能,建议使用外键 如果不用外键,有一定的风险,业务层实现,必须同时修改,业务层与数据层有一定的耦合,工作中业务可能经常发生变化 结论 早期用外键,后期用业务,分析28理论, 会有20%的外键造成80%的资源效率 2的部分用业务实现,减少死锁出现概率,提高并发处理能力 来源: https://www.cnblogs.com/autointerface/p/11934247.html

SQL语句书写技巧

我与影子孤独终老i 提交于 2019-11-26 11:28:40
SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实.最有效的手段,有时甚至是唯一的手段, 比如在不允许大幅度修改现有数据库结构的情况下。 通过优化SQL语句提高查询性能的关键是: ? 根据实际需求情况,建立合适的索引; ? 使用一切可能的方式去利用好索引,避免全表扫描; ? 尽量减少内存及数据I/O方面的开销 一. 建立索引 (一)建立"适当"的索引,是快速查询的基础。 索引( index )是除表之外另一重要的.用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据 时,索引提供了对数据的快速访问。事实上,没有索引,数据库也能根据SELECT语句成功地检索到结果,但随 着表变得越来越大,使用"适当"的索引的效果就越来越明显。注意,在这句话中,我们用了"适当"这个词, 这是因为,如果使用索引时不认真考虑其实现过程,索引既可以提高也会破坏数据库的工作性能。 索引实际上是一种特殊的目录,SQL SERVER提供了两种索引: ? 聚集索引( clustered index ,也称聚类索引.簇集索引) 我们把这种正文内容本身就是一种按照一定规则排列的目录称为"聚集索引"。 例如: 汉语字典中按拼音查某一个字,就是使用"聚集索引",实际上,你根本用不着查目录,直接在字典正文里找, 就能很快找到需要的汉字(假设你知道发音)。 ? 非聚集索引(non clustered

mysql自增主键清零方法

耗尽温柔 提交于 2019-11-26 11:15:13
MySQL数据库自增主键归零的几种方法 如果曾经的数据都不需要的话,可以直接清空所有数据,并将自增字段恢复从1开始计数: truncate table table_name; 1 当用户没有truncate的权限时且曾经的数据不需要时: 删除原有主键: ALTER TABLE 'table_name' DROP 'id'; 1 添加新主键: ALTER TABLE 'table_name' ADD 'id' int(11) NOT NULL FIRST; 1 设置新主键: ALTER TABLE 'table_name' MODIFY COLUMN 'id' int(11) NOT NULL AUTO_INCREMENT,ADD PRIMARY KEY(id); 1 当用户没有权限时: 可以直接设置数据表的 AUTO_INCREMENT 值为想要的初始值,比如10000: ALTER TABLE 'table_name' AUTO_INCREMENT= 10000; 来源: https://www.cnblogs.com/muxi0407/p/11933758.html

Activiti5.13数据库表结构设计

♀尐吖头ヾ 提交于 2019-11-26 03:54:32
1、结构设计 1.1、 逻辑结构设计 Activiti使用到的表都是ACT_开头的。 ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。 ACT_RU_*: ‘RU’表示runtime,运行时表-RuntimeService。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。 ACT_ID_*: ’ID’表示identity (组织机构),IdentityService接口所操作的表。用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。 ACT_HI_*: ’HI’表示history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相关数据,如结束的流程实例,变量,任务,等等 ACT_GE_*: 全局通用数据及设置(general),各种情况都使用的数据。 1.2、 所有表的含义 序号 表名 说明 1 act_ge_bytearray 二进制数据表 2 act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录, 3

阿里系统研发部数据库组教你一文搞懂 MySQL 单表查询的底层实现

旧巷老猫 提交于 2019-11-25 20:48:52
对于我们这些 MySQL的使用者来说,平时用的最多的就是查询功能。DBA时不时丢过来一些慢查询语句让优化,如果连查询是怎么执行的都不清楚还优化个毛线,所以是时候掌握真正的技术了。 MySQL有一个称为 查询优化器的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的 执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。不过查询优化这个主题有点儿大,在学会跑之前还得先学会走,所以本章先来瞅瞅 MySQL怎么执行单表查询(就是 FROM子句后边只有一个表,最简单的那种查询~)。 为了故事的发展,先得有个表: 我们为这个 single_table表建立了1个聚簇索引和4个二级索引,分别是: 为 id列建立的聚簇索引。 为 key1列建立的 idx_key1二级索引。 为 key2列建立的 idx_key2二级索引,而且该索引是唯一二级索引。 为 key3列建立的 idx_key3二级索引。 为 key_part1、 key_part2、 key_part3列建立的 idx_key_part二级索引,这也是一个联合索引。 然后我们需要为这个表插入10000行记录,除 id列外其余的列都插入随机值就好了,具体的插入语句我就不写了