数据库主键

mysql索引结构及其原理

六月ゝ 毕业季﹏ 提交于 2019-12-04 08:54:44
索引数据结构 : 目前大部分数据库系统及文件系统都采用B Tree或者B+Tree作为索引结构 B树:每个节点存储m/2到M个关键字,非叶子节点储存指向关键字范围的子节点的指针或者某节点详细数据;所有关键字在整棵树中出现,且只出现一次,非叶子节点可以命中。 B+树:在B+树的基础上,为叶子节点增加链表指针,所有关键字都在叶子节点中出现,非叶子节点作为叶子节点的索引;B+树总是到叶子节点才能命中。 B*树:在B+树的基础上,为非叶子节点也增加链表指针,将节点的最低利用率从1/2提高到2/3 MySql(默认使用InnoDB引擎),将记录按照页的方式进行管理,每页大小默认为16k(这个值可以修改),Linux默认页大小为4k 3阶的B+树,包含2层索引,每个索引节点4bytes,最后一层要存数据,假设数据大小也是4bytes,最后一层一个叶子节点是4+4 = 8 (4*1024/4) * (4*1024/4) * (4*1024/8) = 500 000 000 约为5亿个key/value数据 为什么使用 B tree或者B+Tree 红黑树也可用来实现索引,但是文件系统及数据库系统普遍采用B Tree或者B+ Tree,为什么? 一般来说,索引本身也很大,不可能全存内存,往往以索引文件的行驶存在磁盘 1.单节点能储存更多数据,使得磁盘IO次数更少 2.叶子节点形成有序链表

MySQL数据库索引

两盒软妹~` 提交于 2019-12-04 08:01:43
1 索引概述 所有MySQL列类型都可以被索引,对相关列使⽤索引是提⾼SELECT操作性能的最佳途径。 根据存储引擎可以定义每个表的最⼤索引数和最⼤索引长度,每种存储引 擎(如 MyISAM、InnoDB、BDB、MEMORY等)对每个表⾄少⽀持16个索引,总索 引长度⾄少为256字节。⼤多数存储引擎有更⾼的限制。 MyISAM和InnoDB存储引擎的表默认创建的都是BTREE索引。MySQL支持对索引字段的前N个字符创建索引(短索引也叫前缀索引)。前缀索引 的长度跟存储引擎相关,对于MyISAM存储引擎的表,索引的前缀长度可以达到1000 字节长,⽽对于InnoDB存储引擎的表,索引的前缀长度最长是767字节。 MySQL中还支持全文本(FULLTEXT)索引,该索引可以用于全文搜索。但是当前最新版本(5.0)中只有MISQM存储引擎支持FULLTEXT索引。并且只限于CHAR、VARCHAR、TEXT列。索引总是对整列进行的,不支持前缀索引。 默认情况下,MEMORY存储引擎使⽤HASH索引,但也⽀持BTREE索引。 2 设计索引的原则 索引的设计可以遵循⼀些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于提升索引的使⽤效率,更⾼效地使⽤索引。 1:搜索的索引列。最适合索引的列是出现在WHERE⼦句中的列,或连接⼦ 句中指定的列,

第八篇:索引原理与慢查询优化

限于喜欢 提交于 2019-12-04 03:31:39
阅读目录 一 介绍 二 索引的原理 三 索引的数据结构 四 聚集索引与辅助索引 五 MySQL索引管理 六 测试索引 七 正确使用索引 八 联合索引与覆盖索引 九 查询优化神器-explain 十 慢查询优化的基本步骤 十一 慢日志管理 一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。 什么是索引? 索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能 非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。 索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。 索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。 30 10 40 5 15 35 66 1 6 11 19 21 39 55 100 你是否对索引存在误解? 索引是应用程序设计和开发的一个重要方面。若索引太多,应用程序的性能可能会受到影响。而索引太少,对查询性能又会产生影响,要找到一个平衡点,这对应用程序的性能至关重要。一些开发人员总是在事后才想起添加索引----我一直认为

Mysql replace 与 insert on duplicate效率分析

冷暖自知 提交于 2019-12-03 21:22:28
我们在向数据库里批量插入数据的时候,会遇到要将原有主键或者unique索引所在记录更新的情况,而如果没有主键或者unique索引冲突的时候,直接执行插入操作。 这种情况下,有三种方式执行: 直接 直接每条select, 判断, 然后insert,毫无疑问,这是最笨的方法了,不断的查询判断,有主键或索引冲突,执行update,否则执行insert. 数据量稍微大一点这种方式就不行了。 稍微高级一些的方式。 replace 这是 mysql 自身的一个语法,使用replace的时候。其语法为: replace into tablename (f1, f2, f3) values(vf1, vf2, vf3),(vvf1, vvf2, vvf3) 这中语法会自动查询主键或索引冲突,如有冲突,他会先删除原有的数据记录,然后执行插入新的数据。 insert on duplicate key . 这也是一种方式, mysql 的insert操作中也给了一种方式,语法如下: INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1; 在insert时判断是否已有主键或索引重复,如果有,一句update后面的表达式执行更新,否则,执行插入。 第一种方式不说了,replace和insert  on duplicate

聚簇索引和非聚簇索引

情到浓时终转凉″ 提交于 2019-12-03 17:35:55
总结: InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分;   一般建表会用一个自增主键做 聚簇索引,没有的话MySQL会默认创建,但是这个主键如果更改代价较高,故建表时要考虑自增ID不能频繁update这点。   我们日常工作中,根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,现在找到主键索引再通过主键索引找数据; 本文链接:https://blog.csdn.net/lm1060891265/article/details/81482136 参考博客:http://www.admin10000.com/document/5372.html 聚簇索引并不是一种单独的索引类型,而 是一种数据存储方式 。具体细节依赖于其实现方式。 MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustered index)。这两种索引内部都是B+树,聚集索引的叶子节点存放着一整行的数据。 Innobd中的主键索引是一种聚簇索引

SQL 创建表

坚强是说给别人听的谎言 提交于 2019-12-03 15:46:57
SQL 创建表是通过SQL CREATE TABLE 语句来实现,该语句是DDL SQL语句 。CREATE TABLE语句用于创建用于存储数据的表。在创建表时,可以为列定义主键、惟一键和外键等完整性约束。完整性约束可以在列级或表级定义。对于不同的RDBMS, CREATE语句的实现和语法是不同的。 CREATE TABLE语句语法 CREATE TABLE table_name (column_name1 datatype, column_name2 datatype,... column_nameN datatype); SQL table_name—是表的名称 column_name1, column_name2 ….-是列的名称 datatype -是列的数据类型,比如char、date、number等 例如:如果要创建employee表,语句应该是这样的: CREATE TABLE employee ( id number(5), name char(20), dept char(10), age number(2), salary number(10), location char(10)); SQL 在Oracle数据库中,整数列的数据类型表示为“number”。在Sybase中,它表示为“int”。 Oracle提供了另一种创建表的方法。 CREATE TABLE

宜信的105条数据库军规

ⅰ亾dé卋堺 提交于 2019-12-03 13:40:59
作为一家金融科技企业,宜信的大量业务都依赖于数据库。如何提高公司整体数据库应用水平,是对DBA的一大挑战,也非常具有现实意义。笔者在宜信的多年工作中,与团队一起总结整理了针对传统关系型数据库的使用规则,并借助自研的数据库审核平台落地,借此帮助研发团队评估数据库开发质量,达到尽早发现问题、解决问题之目的。下图正是这一系统的简单原理图。 如上图所示,针对规则部分又可细分为如下分类(部分)。简单描述如下,后面将逐一详细说明。 一、Oracle规则(对象) 1.1 表、分区 【规则1】 规则说明:超过指定规模且没有分区的表。 规则阈值:2GB(物理大小超过指定阀值)。 规则描述:表的规模过大,将影响表的访问效率、增加维护成本等。常见的解决方案就是使用分区表,将大表转换为分区表。 【规则2】 规则说明:单表或单分区记录数量过大。 规则阈值:1000000(单表或单分区记录数超过指定阀值)。 规则描述:控制单个表或单个分区的数据规模,提高单一对象的访问效率。如记录数过多,应考虑分库、分表、分区等策略。 【规则3】 规则说明:大表过多。 规则阈值:自定义(超过2G的表的数量过多)。 规则描述:大表在所有表中所占比例超过20%(OLTP)或95%(OLAP)。 【规则4】 规则说明:单表分区数量过多。 规则阈值:500(单表分区数量超过指定阀值)。 规则描述:分区表中分区数量过多

Mysql-基本的知识点

南笙酒味 提交于 2019-12-03 11:26:46
Mysql-操作基本知识点 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格) /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES -- 显示系统变量信息 /* 数据库操作 */ ------------------ -- 查看当前数据库 SELECT DATABASE(); -- 显示当前时间、用户名、数据库版本 SELECT now(), user(), version(); -- 创建库 CREATE DATABASE[ IF NOT EXISTS] 数据库名 数据库选项 数据库选项: CHARACTER SET charset_name COLLATE collation_name -- 查看已有库 SHOW DATABASES[ LIKE 'PATTERN'] -- 查看当前库信息 SHOW CREATE DATABASE 数据库名 -- 修改库的选项信息 ALTER DATABASE 库名 选项信息 -- 删除库 DROP DATABASE[ IF EXISTS]

数据库范式

拟墨画扇 提交于 2019-12-03 11:15:02
1NF:   属性的原子性(分到不可再分) 2NF:   实体属性完全依赖于主关键字(表必须有一个主键,二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分)     eg:考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。 因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。     可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。    3NF:   当2NF消除了非属性对码的传递函数依赖(传递依赖),则称为3NF。即不能存在

数据库约束

烈酒焚心 提交于 2019-12-03 09:59:17
之前的一篇文章介绍了数据库mysql的安装过程,在接下来的一些文章中,我将会讲述mysql数据库中的SQL语句,以及Java链接数据库等操作。 在说明SQL语句之前,首先说的是关于数据库的约束。 我们所有的关系数据库都支持对数据表使用约束,因为通过约束我们可以更好的保证数据表里的数据的完整性。约束是在表上强制的执行数据校检规则,约束只要用于保证数据库里数据的完整性,并且当表中的数据存在相互依赖型的时候,可以保护相关的数据不被删除。 为数据表指定约束有如下两个时机:(1).建表的同时为相应的数据列指定约束。(2).建表后创建,以修改表的方式来增加约束。 接下来我主要介绍三种约束:mysql中的一些普通的约束,主键约束,外键约束。 1.mysql中的一些普通约束。 主要包括: (1).unique:唯一约束,指定某列不能为空。用于保证指定列或者指定列组合不允许出现重复值。 (2).not null:非空约束,指定某列的值不能为空。 (3).null:与not null相反,表示有些数据的默认值可以为null. (4).default:指默认值,可以给某一字段设置好相应的默认值。 2.主键约束(primary key):指定该列的值可以唯一的标识该条记录。相当于:非空+唯一。 在mysql数据库操作的过程中,如果没有手动指定主键,在mysql中会自动查找一个具备非空且唯一的字段作为主键