索引

理解聚簇索引

陌路散爱 提交于 2020-02-07 15:09:18
聚簇索引(Cluster Index)也叫索引组织表(Index-organized Table),MySQL用户经常称呼为前者。 聚簇索引并不是数据库索引的某个种类,其描述的是数据的一种存储方式 。我们知道,在InnoDB中,数据是以B+Tree的形式存储的,其特点就是数据都存储在叶子节点上,非叶子节点上只存索引信息,即key值和指向子节点的指针。这种索引和数据的存储方式就叫做聚簇索引,“聚簇”的意思就是通常来说,数据行和相邻的健挨着。 InnoDB通过主键来聚集数据,也就是说聚簇索引的B+Tree上的叶子结点所存储的key总是主键,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替,如果没有这样的索引,InnoDB会隐式地定义一个主键来聚集(存储)数据,这个隐式的主键被称为rowID。 在InnoDB中,存储聚簇索引的B+Tree的叶子节点是一个数据页,默认大小为16K,这些数据页上的数据其实是一个有序链表,会按照主键递增的顺序来进行存储。在上图中,如果要访问ID为10的记录,InnoDB根据索引找到了key为11的索引,访问其左子节点,然后进行遍历(由于在一个数据页中的数据的存放位置是连续的,所以不会有多次寻址的额外开销),比较key值直到找到ID为10的记录。 对于非聚簇索引,InnoDB通常在叶子节点上存储的是数据行的主键值,命中非聚簇索引时

索引那些事儿----基于Mysql

做~自己de王妃 提交于 2020-02-07 03:38:59
目录 背景 索引 存储引擎 存储引擎种类 MyISAM引擎 InnoDB引擎 索引方式 索引类型 单列索引之普通索引 单列索引之唯一索引 单列索引之主键索引 组合索引 全文索引 空间索引 总结 武汉加油!!! 背景 数据库是什么? 这个问题大家都知道吧, 用来存放数据的, 生活中你在银行中存的金额, 或者一个户籍所中存放的户籍以及个人信息, 在比如一个学校的学生信息等等, 这些都存放在我们的数据库里面. 对不数据库中的数据一般采用一些 DML语句 (insert, update, delete)来进行数据操作. 想要查看数据库里面的数据使用select语句进行数据的查询. 对于数据在数据库里面的存放, 可以简单理解为类似 Excel表格 , 表格里面每一行代表一条数据. 一个 Sheet页 来代表一类数据. 一个例子 现在我们有一张excel表格, 里面存放了一个学校的学生信息, 包含学号, 姓名, 班级,年级等等信息 如果, 如果这张表里面只存放了较少的数据( 几十条, 或者十几条 ), 那现在让你 找到关于张三学生的信息 , 我们便开始从上到下或者从下到上开始浏览每一行数据, 直到找到 张三 , 便完成了数据的查询. 但是, 数据量大了, 这个excel存放了成千上万条数据, 再让你找出来张三, 你还是需要从上到下, 或者从下到上开始找 张三 , 这一次因为数据变多了,

MySQL随笔05_索引(下)

天大地大妈咪最大 提交于 2020-02-07 02:12:37
一、覆盖索引 非主键索引查询,若结果所需要的字段只在主键索引上有,则需要回到主键搜索树,此过程称为 回表 。 非主键索引查询,若结果所需要的字段在当前索引树上已经存在,可直接提供查询结果,不需要回表。即在查询中,非主键索引已经“覆盖了”查询需求,称为 覆盖索引 。 如下图,T表,ID为主键,k为普通索引,有如下两个查询语句: select * from T where k=3; -- 需要回表 select ID from T where k=3; -- 不需要回表 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段 。 对于某些高频数据查询请求,可以创建联合索引,以便用到覆盖索引,从而不需要回表查,提升查询性能。 二、最左前缀原则 B 树 索引结构,可以利用索引的“最左前缀”,来定位记录。 只要满足最左前缀,就可以利用索引来加速检索。 这个最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。 在建立联合索引的时候,如何安排索引内的字段顺序 评估标准 ——索引的复用能力。 第一原则 ——如果通过调整顺序,可以减少维护一个索引,那么这个顺序就是需要优先考虑采取的。 三、索引下推 对于不符合最左前缀的部分的索引优化处理。 MySQL5.6之前,只能从非主键索引上 回表 到主键索引上找出数据行,在进行数据比对过滤。

第十八章 全文本搜索

眉间皱痕 提交于 2020-02-07 01:03:01
第十八章 全文本搜索 使用MySQL的全文本搜索功能进行高级的数据查询和选择。 18.1 理解全文本搜索 注 :并非所有引擎都支持全文本搜索。两个最常用的引擎为 MyISAM 和 InnoDB ,前者支持全文本搜索,而后者不支持。 LIKE 关键字,利用通配操作符匹配文本(和部分文本)。使用LIKE,能够查找包含特殊值或部分值的行(不管这些值位于列内什么位置)。 正则表达式 :使用正则表达式,可以编写查找所需行的非常复杂的匹配模式。 虽然这些搜索机制非常有用,但存在几个重要的限制。 性能——通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行(而且这些搜索极少使用表索引)。因此,由于被搜索行数不断增加,这些搜索可能非常耗时。 明确控制——使用通配符合正则表达式匹配,很难(而且并不总是能)明确地控制匹配什么和不匹配什么。例如,指定一个词必须匹配,而一个词仅在第一个词确实匹配的情况下才可以匹配或者才可以不匹配。 智能化的结果——虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索,但它们都不能提供一种智能化的选择结果的方法。例如,一个特殊词的搜索将会返回包含该词的所有行,而不区分包含单个匹配的行和包含多个匹配的行(按照可能是更好的匹配来排列它们)。类似,一个特殊词的搜索将不会找出不包含该词但包含其他相关词的行。 所有这些限制以及更多限制都可以用全文本搜索来解决。在使用全文本搜索时

MySql索引

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-06 22:10:01
MySql索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度 索引也会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件 建立索引会占用磁盘空间的索引文件 所以,索引不是越多也好,我们的目的就是把索引建得恰到好处 Mysql索引相关知识 存储引擎 MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎 同一个数据库也可以使用多种存储引擎的表 在实际开发中使用最多的两种引擎是MyISAM和InnoDB(几乎都是InnoDB) MyISAM MyISAM高速引擎,拥有较高的插入,查询速度 MyISAM存储不支持事务、行级锁和外键约束的功能 MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点 MyISAM的并发插入特性允许同时选择和插入数据 MyISAM表是独立于操作系统的 每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件:表定义文件(.frm),数据文件(.MYD),索引文件(.MYI) InnoDB InnoDB:5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢 InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引

mysql如何避免回表查询

為{幸葍}努か 提交于 2020-02-06 15:18:38
《 迅猛定位低效SQL? 》留了一个尾巴: select id,name where name='shenjian' select id,name ,sex where name='shenjian' 多查询了一个属性,为何检索过程完全不同? 什么是回表查询? 什么是索引覆盖? 如何实现索引覆盖? 哪些场景,可以利用索引覆盖来优化SQL? 这些,这是今天要分享的内容。 画外音:本文试验基于MySQL5.6-InnoDB。 一、什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通索引有什么差异? InnoDB 聚集索引 的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引: (1)如果表定义了PK,则PK就是聚集索引; (2)如果表没有定义PK,则第一个not NULL unique列是聚集索引; (3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引; 画外音:所以PK查询非常快,直接定位行记录。 InnoDB 普通索引 的叶子节点存储主键值。 画外音:注意,不是存储行记录头指针,MyISAM的索引叶子节点存储记录指针。 举个栗子,不妨设有表: t(id PK, name KEY, sex, flag); 画外音

SQL索引

牧云@^-^@ 提交于 2020-02-06 12:31:02
索引 索引概念、索引模型 索引是一种数据结构,能够帮助我们快速的检索数据库中的数据 数据结构:Hash索引和B+树 优缺点 Hash索引低层是哈希表,哈希表是一种KV存储数据的结构,数据存储上没有任何顺序,区间查询无法直接通过索引,可以做等值查询,不支持最左匹配规则。如果存在大量重复键,哈希索引效率会很低,存在哈希碰撞问题 B+ Tree是一种多路平衡查询树,节点天然有序,叶子节点存储了整行数据的事主键索引,也被称为聚簇索引,叶子节点存储主键的值的是为非聚簇索引。 聚簇索引和非聚簇索引的区别 聚簇索引:叶子节点查询出来的是整行数据 非聚簇索引:叶子节点查询出来的是主键的值,得到值之后还要通过主键的值再查询一次,也可以通过覆盖索引查询一次 联合索引、最左前缀匹配 在做联合索引的时候,将识别度最高的字段放在最左边(将where字句中使用最频繁的一列放在最左边) 最左匹配规则:如(key1,key2,key3)相当创建了(key1)(key1,key2)(key1,key2,key3) 通过explain查看sql语句的执行计划 注:查询优化器,可能使查询语句没有通过索引 来源: CSDN 作者: 姜_白 链接: https://blog.csdn.net/weixin_41730409/article/details/104192068

mysql——B+树索引

不打扰是莪最后的温柔 提交于 2020-02-06 08:27:50
文章目录 mysql——B+树索引 何谓索引 索引类型 聚簇索引 非聚簇索引 创建索引 创建语句 创建原则 索引覆盖 最左前缀原则 索引失效 不使用索引 参考资料 mysql——B+树索引 何谓索引 索引是一种高效的数据结构,可以帮助数据库快速搜索数据,给某个字段建立索引,就会生成一棵以该字段排序的B+树,如果你不懂B+树,可以想一想为什么排序后二分查找会这么快。索引也不可以过度使用,否则会消耗很多磁盘空间,并且DML操作的时候维护索引也会很消耗性能。 索引类型 聚簇索引 聚簇索引又叫聚集索引或主键索引 聚簇索引有以下两个特点: 特点1: 按主键值的大小进行记录和页的排序,数据页(叶子节点)之间是按照主键值从小到大排序的一个双向链表 特点2: B+树的叶子节点存储的是完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列) InnoDB存储引擎会自动的为我们主键创建聚簇索引,因此只有在搜索添加是主键才能发挥作用 非聚簇索引 别名非聚集索引,二级索引,复制索引,辅助索引。 非聚簇索引按照指定的索引列排序生成B+树,并且叶子节点只存储了索引列的值和主键值,这肯定是为了节省磁盘空间,这使得我们非聚集索引查询时候只能查到主键值,如果你需要记录中除了索引列的其他列的数据,只能通过查到的主键再走一遍聚集索引,这叫做 回表 非聚簇索引又有 唯一索引,联合索引,前缀索引 唯一索引

数据库索引

走远了吗. 提交于 2020-02-06 03:15:30
1.为什么要使用索引 因为索引可以避免全表扫描查找数据,提升检索效率。 2.什么样的信息能成为索引 主键、唯一键等,只要是让数据具备一定区分性的字段都能成为索引 3.索引的数据结构 主流为B±tree 还有Hash结构和 BitMap结构; Mysql数据库不支持BitMap索引,基于InnoDB和Myisam引擎的Mysql不支持显示Hash 来源: CSDN 作者: 梨子果果哟 链接: https://blog.csdn.net/qq_42931883/article/details/104181047