mysql索引

MySQL--索引

廉价感情. 提交于 2020-02-12 01:27:56
索引 索引是为了提高数据查询的效率,就类似与书的目录。 索引的常见模型 哈希表 ,也就是KV类型的结构,输入K即可得到相应的值,思路就是把值放到数组里,用一个哈希函数把K换成一个位置,然后在这个位置上找寻value。当不同的K经过换算有相同的结果是,采用拉链法。如下图: 在这个图中,倘若K换算后的值得到的N,那么目标就是N位置后面的链表的某一个。采用顺序查找。用哈希表查询等值很快,但是缺点是不能进行范围查询。 有序数组 ,相比于哈希表,有序数组的好处就是可以进行范围查询,同时,用二分的话,等值查询的性能也可以很好的保证。但是,有序数组的缺点就是只适合静态存储引擎。 二叉搜索树 ,根据二叉树的特点(左孩子小于父节点,右孩子大于父节点),可以很容易来搜索树中的某个值,但是二叉搜索树在一些情况下会出现左右高度不平衡,所以需要保持一颗二叉平衡树,这样查询的复杂度是O(logN),更新一个结点也是O(logN)。 但是实际上二叉树是很少使用的,原因无他,结点数量过多的情况下,二叉树的高度也增加,访问磁盘的次数也会增加,从而查询变慢,所以引入了N叉树,N的值取决于数据块点大小。 InnoDB的索引模型 InnoDB中,表都是根据主键顺序以索引的形式来存放的,使用B+树来存储。 每一个索引都对应有一个B+树,比如建立一个表并设置一个索引, CREATE table t6( id int

MySQL索引策略及优化

别说谁变了你拦得住时间么 提交于 2020-02-10 16:38:04
MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization)。本章讨论的高性能索引策略主要属于结构优化范畴。本章的内容完全基于上文的理论基础,实际上一旦理解了索引背后的机制,那么选择高性能的策略就变成了纯粹的推理,并且可以理解这些策略背后的逻辑。 1. 示例数据库 为了讨论索引策略,需要一个数据量不算小的数据库作为示例。本文选用MySQL官方文档中提供的示例数据库之一:employees。这个数据库关系复杂度适中,且数据量较大。下图是这个数据库的E-R关系图(引用自MySQL官方手册): MySQL官方文档中关于此数据库的页面为 http://dev.mysql.com/doc/employee/en/employee.html 。里面详细介绍了此数据库,并提供了下载地址和导入方法,如果有兴趣导入此数据库到自己的MySQL可以参考文中内容。 2. 最左前缀原理与相关优化 高效使用索引的首要条件是知道什么样的查询会使用到索引,这个问题和B+Tree中的“最左前缀原理”有关,下面通过例子说明最左前缀原理。 这里先说一下联合索引的概念。在上文中,我们都是假设索引只引用了单个的列,实际上,MySQL中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组<a1, a2, …, an>

【转】MySql索引

与世无争的帅哥 提交于 2020-02-10 15:21:32
https://segmentfault.com/a/1190000010991930 索引(key)是存储引擎用于快速找到记录的一种数据结构。它和一本书中目录的工作方式类似——当要查找一行记录时,先在索引中快速找到行所在的位置信息,然后再直接获取到那行记录。 在MySql中,索引是在存储引擎层而不是服务器层实现的,所以不同的存储引擎对索引的实现和支持都不相同。 B-TREE索引 B-TREE索引是使用最多的索引。很多存储引擎采用的都是B-TREE数据结构的变体实现该索引,例如InnoDB使用的是B+TREE,即每个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点范围遍历。 不同存储引擎使用B-TREE索引的方式也不同。例如MyISAM使用前缀压缩技术使索引更小,而InnoDB则按照原数据格式进行存储。再如MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引的行。 B-TREE中的所有值都是按顺序存储的,每个叶子页到根的距离相同。下图展示了InnoDB中的B-TREE索引是如何工作的: 当查找一行记录时,存储引擎会先在索引中搜索。从索引的根节点开始,通过比较节点页的值和要查找的值逐层进入下层节点,最底层叶子节点的指针指向的是被索引的数据。这样的查找方式避免了全表扫描,加快访问数据的速度。此外因为B-Tree对索引列是顺序存储的

MySQL my.cnf详解

你说的曾经没有我的故事 提交于 2020-02-10 12:27:14
1 #*** client options 相关选项 ***# 2 #以下选项会被MySQL客户端应用读取。注意只有MySQL附带的客户端应用程序保证可以读取这段内容。如果你想你自己的MySQL应用程序获取这些值。需要在MySQL客户端库初始化的时候指定这些选项。[client] 3 port = 3306 4 socket = /usr/local/mysql/tmp/mysql.sock 5 [mysqld]!include /usr/local/mysql/etc/mysqld.cnf 6 #包含的配置文件 ,把用户名,密码文件单独存放 7 port = 3306 8 bind-address = 0.0.0.0 9 server-id = 1 10 #表示是本机的序号为1,唯一 11 socket = /usr/local/mysql/tmp/mysql.sock 12 pid-file = /usr/local/mysql/var/mysql.pid 13 basedir = /usr/local/mysql/ 14 datadir = /usr/local/mysql/var/ 15 tmpdir = /usr/local/mysql/tmp/ 16 #此目录被 MySQL用来保存临时文件.例如,它被用来处理基于磁盘的大型排序,和内部排序一样,以及简单的临时表

mysql锁机制

大城市里の小女人 提交于 2020-02-09 07:07:11
一、相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁(抽象性,不真实存在这个锁) |--乐观锁(抽象性,不真实存在这个锁) 二、InnoDB与MyISAM Mysql 在5.5之前默认使用 MyISAM 存储引擎,之后使用 InnoDB 。查看当前存储引擎: show variables like '%storage_engine%'; MyISAM 操作数据都是使用的表锁,你更新一条记录就要锁整个表,导致性能较低,并发不高。当然同时它也不会存在死锁问题。 而 InnoDB 与 MyISAM 的最大不同有两点:一是 InnoDB 支持事务;二是 InnoDB 采用了行级锁。也就是你需要修改哪行,就可以只锁定哪行。 在 Mysql 中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql 语句操作了主键索引,Mysql 就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。 InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 会通过隐藏的聚簇索引来对记录加锁。也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁

mysql数据库索引

人盡茶涼 提交于 2020-02-09 03:26:31
1.数据库索引是什么? 为了加速对表中数据行的检索而创建的一种分散存储的数据结构 2.为什么要用索引? ●索引能极大的减少存储引擎需要扫描的数据量 ●索引能把随机I0变成顺序I0 ●在进行分组与排序时索引可以让我们避免使用临时表 为什么不每一列都创建索引 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。 3.mysql索引的原则 (1)列的离散型:count(distinct col) 重复的列 离散性好越好,选择越好 (2)最左匹配原则 从左到右依次匹配且不能跳过 4. MySQL为什么选择B+tree 这里有一个创建二叉树或者b树的网站,可以自己去玩一下 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 网站样子如下: (1)二叉查找树 规则: (1)非叶子节点只能允许最多两个子节点存在。 (2

Mysql索引那些事情

冷暖自知 提交于 2020-02-09 03:22:20
什么是索引? 索引在搜索引擎优化简单解释 指已经被收录且参与关键词排名的页面。 索引的通俗解释 索引就像是图书的目录,根据目录中的页码快速找到所需内容。 索引在百度百科中的解释 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 MySQL官方对索引的定义为: 索引(Index)是帮助MySQL高效获取数据的数据结构。我们可以简单理解为:**快速查找排好序的一种数据结构。**Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引) 有哪些索引算法 hash算法 什么是hash 如果有编程经验的小伙伴都知道不管是哪种语言都是有hash实现,简单来说就是一个 key 通过一个 hash(key) 算法后得到一个固定长度值,可以通过这个计算后的值与存放数据容器长度取模后的值做索引,快速定位元素( 可以看作类似数组索引 ),查询时间复杂度为O(1),在java里面一个对象可以重写hashCode()方法。 hash数据结构 存在问题 只支持等值索引定位 hash算法虽然能快速定位元素位置,时间复杂度O(1)查询速度是相当可观的, but 这个作为 mysql

100道MySQL常见面试题总结

余生颓废 提交于 2020-02-08 20:07:25
前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好,虽然知识点大部分都知道,但是无法将知识串联起来. 因此决定搞一个MySQL灵魂100问,试着用回答问题的方式,让自己对知识点的理解更加深入一点. 此文不会事无巨细的从select的用法开始讲解mysql,主要针对的是开发人员需要知道的一些MySQL的知识点,主要包括索引,事务,优化等方面,以在面试中高频的问句形式给出答案. 索引相关 关于MySQL的索引,曾经进行过一次总结,文章链接在这里 Mysql索引原理及其优化. 1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B

MySQL(二)之B-Tree和B+Tree

别来无恙 提交于 2020-02-08 15:38:04
B-Tree 叶节点具有相同的深度,叶节点的指针为空 所有索引元素不重复 节点中的数据索引从左到右递增排列 由于B-Tree的特性,在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。 例如一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2),检索一个key,其查找节点个数的渐进复杂度为O(logdN)。从这点可以看出,B-Tree是一个非常有效率的索引数据结构。 另外,由于插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质. B+Tree(B-Tree变种)(mysql索引存储结构) 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引 叶子节点包含所有索引字段 叶子节点用指针连接,提高区间访问性能 为什么根节点不存储数据,叶子节点存储数据? 希望树的横向(根节点)能存储更多的索引,将具体的数据存储到叶子节点上 InnoDB一棵B+树可以存放多少行数据 ? 一般主键为bigint为8 Byte,指针为6 Byte,InnoDB存储引擎最小储存单元为页(Page),一个页的大小是16KB,16KB (16

SQL学习笔记

浪子不回头ぞ 提交于 2020-02-08 10:33:17
目录 SQL(Structured Query Language)学习笔记 Terminal登录数据库 SQL特性 SQL约束 SQL索引 触发器 SQL优化执行计划 索引唯一扫描(index unique scan) 索引范围扫描(index range scan) 索引全扫描(index full scan) 索引快速扫描(index fast full scan) 检索数据 排序检索数据 过滤数据(字符需要用'' 数值不需要'') 通配符过滤数据 拼接字段(||) SQL函数 分组 select执行顺序 子查询 联结 等值联结/内联结 自联结 自然联结 外联结 组合查询 UNION SQL(Structured Query Language)学习笔记 Terminal登录数据库 1.登录 mysql -u root -p ; 2.显示所有数据库 show databases ; 3.使用数据库 use “database name” ; 4.显示数据库中所有表 show tables; 5.删除表 drop table ”Customers“; SQL特性 SQL约束 1.主键 CREATE TABLE OrderItems ( order_num int NOT NULL PRIMARY KEY, order_item int NOT NULL , prod_id char