首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏兜兜毛毛

    MySQL 索引3

    什么是索引索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 跟大多数数据库一样,InnoDB也有页的概念(也可以称为块),每个页默认16KB。页是InnoDB存储引擎磁盘管理的最小单位,通过innodb_page_size设置。 https://www.cs.usfca.edu/~galles/visualization/BTree.html 比如MaxDegree(路数)是3的时候,我们插入数据1、2、3,在插入3的时候,本来应该在第一个磁盘块 把中间的数据2提上去,把1和3变成2的子节点。 ? 从这个里面我们也能看到,在更新索引的时候会有大量的索引的结构的调整,所以解释了为什么我们不要在频繁更新的列上建索引,或者为什么不要更新主键。 索引的创建 1、在用于where判断order排序和join的(on)字段上创建索引 2、索引的个数不要过多。——浪费空间,更新变慢。 3、区分度低的字段,例如性别,不要建索引

    57420发布于 2020-08-11
  • 来自专栏程序员奇点

    数据库索引

    数据库索引 数据库索引,在日常工作中会经常接触到,比如某一个 SQL 查询比较慢,分析原因后,经常会说 “给某个字段加个索引”,索引又是如何工作的? image 树可以是二叉树,也可以是多叉树,多叉数是每个阶段多个儿子,儿子从左到右保持递增,但是实际上大多数的数据库存储用的不是二叉树,索引不止存储在内存中,还要写到磁盘上。 int not null, name varchar(16), index (k))engine=InnoDB; 表中R1 ~ R5的(ID,k)值分别为(100,1)、(200,2)、(300,3) 其中 ID 是主键, 普通索引为 k; ? 普通索引和主键索引有啥区别? 主键索引的叶子节点存的是整行数据,在 InnoDB 里主键索引也被称为是聚簇索引(clustered index)。 image 什么场景适合用业务字段做主键索引? 只有一个索引索引必须是唯一索引 如果没有其他索引,所以也就不用考虑其他索引的叶子节点大小的问题。

    88531发布于 2020-05-29
  • 来自专栏从零开始的Code生活

    数据库索引

    什么是索引 索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。 为什么使用索引 从上面的例子可以看出来使用索引的一大好处就是可以大大提高查询速度,如果把使用索引的MYSQL比作一辆兰博基尼,没使用索引的MYSQL就相当于一辆马车。 索引分单索引和组合索引,单列索引就是一个索引只包含一个列,一个表可以包含多个单列索引。 组合索引是一个索引包含多个列。 使用索引的优点是可以大大提高查询速度,缺点就是更新表的速度会变慢。 数据库索引有哪些 1.聚簇索引(主键索引):主键上的索引,表的所有字段都会根据主键排序 2.非聚簇索引:普通字段的索引 3.联合索引:一个索引包含多个字段 key 'name_age_sex' ('name =不走索引索引都不使用索引 F:name走索引,后面的不走,理由同上 什么情况不使用索引 key 'age' (age) key 'name' (name) LIKE like后面的值%在前面的不使用索引

    51020编辑于 2022-01-13
  • 来自专栏国产程序员

    数据库索引

    适当的使用索引可以提高数据检索速度,可以给经常需要进行查询的字段创建索引 oracle的索引分为5种:唯一索引,组合索引,反向键索引,位图索引,基于函数的索引 索引的创建 Oracle和MySQL创建索引的过程基本相同 5条记录,采用索引去访问记录的话,那首先需访问索引表,再通过索引表访问数据表,一般索引表与数据表不在同一个数据块,这种情况下ORACLE至少要往返读取数据块两次。 数据重复且分布平均的表字段:假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。 对千万级MySQL数据库建立索引的事项及提高性能的手段: l 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 如:selectid from t where substring(name,1,3)='abc' ,name以abc开头的id,应改为: select id from t where name like'abc

    79730发布于 2019-07-04
  • 来自专栏java初学

    数据库索引

      在数据量非常大的情况下,在数据库中加入索引能够提升数据库查找的性能,常见的mysql索引分为以下几类: ①普通索引 可以直接创建索引:CREATE INDEX indexName ON table 如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。 注意多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。   ,之后扫描结果集1,产生满足fname='Zhiqun'的结果集2,再扫描结果集2,找到 age=26的结果集3,即最终结果。        3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)

    1.3K170发布于 2018-05-14
  • 来自专栏日常笔记

    数据库索引

    最左匹配 建立这样的索引相当于建立了索引a、ab、abc三个索引。一个索引顶三个索引当然是好事,毕竟每多一个索引,都会增加写操作的开销和磁盘空间的开销。 覆盖(动词)索引。 那么MySQL可以直接通过遍历索引取得数据,而无需读表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。 所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一 索引列越多,通过索引筛选出的数据越少。 有1000W条数据的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出 1000W*10%=100w 条数据,然后再回表从100w条数据中找到符合b=2 and c= 3的数据,然后再排序,再分页;如果是复合索引,通过索引筛选出1000w *10% *10% *10%=1w

    87730发布于 2020-08-05
  • 来自专栏Kevin-ZhangCG

    数据库索引

    数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。   我们通过一个简单的例子来开始教程,解释为什么我们需要数据库索引。 1.文件很大,不可能全部存储在内存中,故要存储到磁盘上   2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/+Tree,还跟磁盘存取原理有关,具体看下边分析)   3.  同样的,就像一本书的索引包含页码一样,数据库索引包含了指针,指向你在SQL中想要查询的值所在的行。 使用数据库索引会有什么代价?   那么,使用数据库索引有什么缺点呢?    (3) 盘面确定以后,盘片开始旋转,将指定块号的磁道段移动至磁头下。 耗费时间: 查找时间:即完成步骤(1)的时间,这部分耗时最多 等待时间:即完成步骤(3)的时间 传输时间:数据通过系统总线送到内存的时间 磁盘读取数据是以盘块(block)为基本单位的。

    1.4K00发布于 2018-09-20
  • 来自专栏云计算与大数据

    数据库索引

    数据库索引 索引是应用设计和开发的一个重要方面,如果索引太多,就会影响Insert,Update,Merge和Delete等数据修改语句的性能, 索引太少,又会影响Select,Insert,Update 开发人员必须了解索引,清楚如何在应用中使用索引,而且知道何时使用索引(以及何时不使用索引)。 DBA则需要考虑索引的增长,空间使用以及其他物理特性,并考虑到索引对系统总体性能的影响。 B*Tree 聚簇索引(B*Tree cluster index): 这是传统B*Tree索引的一个近似变体。B*Tree聚簇索引是对聚簇建立的索引。 降序索引(descending index) 反向键索引(reverse key index) 位图索引(bitmap index) 位图联结索引(bitmap join index) 基于函数的索引( function-based index) 应用域索引(application domain index) B*Tree索引(所说的“传统”索引)是数据库中最常用的一类索引结构,其实现与二叉查找树很相似

    52820编辑于 2023-03-18
  • 来自专栏python-爬虫

    数据库索引

    07.21自我总结 数据库索引 1.什么是索引? 即搜索引导,索引是一个特殊的数据结构,其存储的关键信息与详细信息的位置对应关系,加速索引 索引的影响: - 正确使用索引才能加速查询; - 索引需要额外的占用数据空间; - 索引的加入,使数据的crud 变慢 索引的应用场景: ​ 查询操作较多,写入较少;本质原理是尽可能减小搜索范围 2.磁盘IO 数据库的数据最终存储到了硬盘上,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内 每一次IO读取的数据我们称之为一页(page) 索引的目的:尽可能减低io次数,算法支持:二分查找法,应该尽可能的将数据量小的字段作为索引 3.索引数据结构 b+树 ​ 在b+树中 叶子节点才是存储真实数据的 ,例如:select count( ) from usr where id 3 = 6; 也会遍历所有记录 模糊匹配中,%尽量不要写在前面 and语句中会自动找一个具的字段优先执行,所以我们应该在and

    80520发布于 2019-07-23
  • 来自专栏python-爬虫

    数据库索引

    数据库索引 1.什么是索引? 即搜索引导,索引是一个特殊的数据结构,其存储的关键信息与详细信息的位置对应关系,加速索引 索引的影响: 正确使用索引才能加速查询; 索引需要额外的占用数据空间; 索引的加入,使数据的crud变慢 索引的应用场景 : ​ 查询操作较多,写入较少;本质原理是尽可能减小搜索范围 2.磁盘IO 数据库的数据最终存储到了硬盘上,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们 每一次IO读取的数据我们称之为一页(page) 索引的目的:尽可能减低io次数,算法支持:二分查找法,应该尽可能的将数据量小的字段作为索引 3.索引数据结构 b+树 ​ 在b+树中 叶子节点才是存储真实数据的 ,例如:select count() from usr where id 3 = 6; 也会遍历所有记录 模糊匹配中,%尽量不要写在前面 and语句中会自动找一个具的字段优先执行,所以我们应该在and

    64830发布于 2019-07-22
  • 来自专栏宇宙之_一粟

    数据库索引

    为什么要使用使用索引? 最简单的方式--全表扫描,普遍认为很慢。索引类似于字典,通过索引快速查询数据。 2. 什么样的信息能成为索引? 主键、唯一键以及普通键等。 3. 索引的数据结构? 生成索引,建立二叉查找树进行二分查找 生成索引,建立B树结构进行查找 生成索引,建立B+树结构进行查找 生成索引,建立Hash结构进行查找 优化你的索引结构 二叉查找树上阵 二分查找 O(logn) 缺点是退化成链表 : B+树的磁盘读写代价更低 B+树的查询效率更加稳定 B +树更有利于对数据库的扫描 适合范围查询 Hash索引也可以考虑一下 遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高 BitMap 索引是个神器 Oracle使用,锁粒度非常大,不适合高并发系统 4. 密集索引和稀疏索引的区别 密集索引文件中的每个搜索码值都对应一个索引值 稀疏索引文件只为索引码的某些值建立索引项 .frm .ibd .frm .MYI .MYD 1. 如何定位慢查询?

    48210编辑于 2022-05-13
  • 来自专栏素履coder

    数据库索引

    所以有序数组索引只适用于查询的情况 搜索树 二叉查找树 平衡二叉树 N叉树 实际上大多数的数据库存储并不使用二叉树。原因是,索引不止存在内存中,还要写到磁盘上。 那么,我们就不应该使用二叉树,而是要使用“N叉”树,N叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。 * from T where k between 3 and 5的执行流程: 在k索引树上找到k=3的记录,取得ID=300 再到ID索引树查到ID=300对应的R3(第一次回表) 在k索引树取下一个值 val3; SELECT * FROM tbl_name WHERE col1=val1 AND col3=val3; 第一条和第二条和第三条查询语句用到了索引,第二条和第三条效果是一样的,即与where 在数据库正常关闭(shutdown)的过程中,也会执行merge操作。显然,如果能够将更新操作先记录在change buffer,减少读磁盘,语句的执行速度会得到明显的提升。

    64320编辑于 2022-02-17
  • 来自专栏全栈程序员必看

    es数据库索引_sql 创建索引

    dimensionValues":"string", "stock":"string", "salesNum":"string" } } } } } index — 索引名称 type — 索引type 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    1.2K20编辑于 2022-10-04
  • 来自专栏全栈程序员必看

    数据库4种索引类型_数据库索引类型

    以MKVCache为例,使用的哈希算法在如下文件中: MKHash.h MKHash.cpp DCache在内存中将数据分为索引区和数据区: 数据区用于存储真实的数据 索引区只记录索引的值和对应数据区的地址 *ptr++; value += (value << 10); value ^= (value >> 6); } value += (value << 3) unsigned int uHash = HashRawString(key); return uHash; } 一致性哈希的原理不在这里阐述,大家可以自行搜索,这个算法可以解决数据迁移和数据库扩缩容过程中 DCache采用了这个算法,在数据迁移或数据库横向扩缩容时,最多只会影响到相邻的2个数据节点,而不是需要所有节点都重新分布数据。这个原理跟Redis-Cluster的实现类似。 哈希区 这里定义了2种哈希索引结构: 主key的索引 联合key的索引 在 tc_multi_hashmap_malloc.h文件中,主key的哈希结构定义: /** * 主key HashItem *

    1.2K30编辑于 2022-11-03
  • 来自专栏不想当开发的产品不是好测试

    数据库索引问题

    # 解决 原因就是因为limit不同,导致走了不同的索引 走的索引不一样,决定了要检索的数据量多少 1、当你要取的数据很少的时候,mysql认为走start_time的索引很快就能找够满足条件的数据,结果实际上满足条件的数据按照 2、而当你limit20的时候mysql认为按照其他索引可能需要扫描很多的记录才能找到你要的结果,所以走了city_id的索引。 强制使用一个索引,try,可以解决,但不够灵活 2. order by 后面的时间做个空运算,干扰下优化器, <!

    89420发布于 2018-10-09
  • 来自专栏Devops专栏

    Mysql数据库-索引

    Mysql数据库-索引 2.1 索引概述 MySQL索引(index): 是帮助MySQL高效获取数据的数据结构,所以索引的本质就是数据结构! 在表数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式指向数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引数据库中用来提高性能的最常用的工具。 2.2 索引优势劣势 2.2.1 优势 1) 类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。2) 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。 通常使用在数据库和操作系统中的文件系统, 特点是能够保持数据稳定有序. # 要理解BTree索引原理,我们需要依次学习 1. 磁盘存储的特点 2. BTree的特点 3.

    2.7K10编辑于 2022-01-17
  • 来自专栏程序员奇点

    数据库索引原理

    image 现在,我们一起来看看这条SQL查询语句的执行流程: 在k索引树上找到k=3的记录,取得ID=300 再到ID索引树查到ID=300对应的R3 在k索引树取下一个值k=5,取得ID=500 再回到 可以看到,这个查询过程读了k索引树的3条记录(步骤1、3和5),回表了两次(步骤2和4)。 如何进行索引优化,避免回表? 什么是覆盖索引? 如果执行的语句是select ID from T where k between 3 and 5, 这时只需要查ID的值, 而ID的值已经在k索引树上了, 因此可以直接提供查询结果, 不需要回表。 这时, 你也能够用上这个索引, 查找到第一个符合条件的记录是ID3, 然后向后遍历, 直到不满足条件为止。 只要满足最左前缀, 就可以利用索引来加速检索。 只能从ID3开始一个个回表。 到主键索引上找出数据行, 再对比字段值。 ? image 有索引下堆优化的情况 把 age !=10 的先过滤掉,然后再回表查询。 ? 索引下堆优化

    86130发布于 2020-05-29
  • 来自专栏落雨的专栏

    MySQL数据库——索引

    概述 索引在MySQL中也叫做"键",保存着数据位置的信息 其作用是为了加快数据库的查询速度 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。 索引的使用 添加索引 alter table 表名 add index 索引名(字段名); #案例 alter table classes add index my_name(name); #给classes 表中的name列添加名为my_name的索引 主键会自动创建索引,外键约束也会自动创建索引 删除索引 drop index 索引名 on 表名; #案例 drop index my_name on classes ; #删除classes表中的my_name索引 添加联合索引 语法 联合索引又叫复合索引,是MySQL的InnoDB引擎中的一个索引方式,如果一个系统频繁地使用相同的几个字段查询结果,就可以考虑建立这几个字段的联合索引来提高查询效率 = 10; #没有使用联合索引

    31.5K105编辑于 2022-03-07
  • 来自专栏龙进的专栏

    MySQL数据库索引

    建立数据库索引是提升运行效率的重要手段,使用索引能大大提升MySQL的检索速度。创建索引时,首先确保该索引是应用SQL查询语句的条件。(一般为where子句的条件) 索引有单列索引和组合索引两种。 单列索引也就是一个索引只包含一个列,一个数据表可以包含多个单列索引,但是这个不是组合索引哦!!!!!! 组合索引是一个索引包含了多个列。 索引也是一张表,包含了主键和索引字段,并指向实体表的记录。 因为MySQL不仅需要保存数据,还要更新索引文件。并且,建立索引要占用一定的磁盘空间。 唯一索引 唯一索引与前面提到的索引类似,区别在于,索引列的值必须唯一,但是允许有空值。 唯一索引有下列几种创建方式 直接创建索引 create unique index indexname on mytable(username(length)) 通过修改表的结构增加索引 alter table 普通索引是最基本的索引,他没有任何限制。

    2.4K30编辑于 2022-10-31
  • 来自专栏后端架构

    数据库索引优化

    前言数据库索引是经在项目中常常使用到的,但索引是吧双刃剑,提高了查询但是也拖慢了修改的速度。索引优化思路原文翻译如下:提高 SELECT 操作性能的最佳方法是在查询中测试的一个或多个列上创建索引。 尽管为查询中可能使用的每个列创建索引可能很诱人,但不必要的索引会浪费空间,并且会浪费 MySQL 确定要使用哪些索引的时间。索引还会增加插入、更新和删除的成本,因为每个索引都必须更新。 选择合适的索引类型单列索引: 适用于单个字段的查询。复合索引: 适用于多个字段的联合查询。全文索引: 适用于大文本字段的模糊查询。空间索引: 适用于地理位置信息的查询。 优化索引结构尽量使用前缀索引,减少索引占用空间。合理设置索引列的顺序,满足查询需求。适当调整索引的填充因子,提高索引页的利用率。维护索引健康定期进行索引碎片整理,提高索引访问效率。 这就导致一种新的解决方案产生,对数据库进行一个读写分离或者说分库分表,这也是解决方案的一种。原因是因为当你在对数据进行增删改的时候,会对数据进行上锁,也就是常说的事务隔离级别。

    72810编辑于 2024-07-12
领券